java实现单链表中是否有环的方法详解
这是一道微软经典笔试题,就是两个指针h1,h2都从头开始遍历单链表,h1每次向前走1步,h2每次向前走2步,如果h2碰到了NULL,说明环不存在;如果h2碰到本应在身后的h1说明环存在(也就是发生了套圈)。
如果环不存在,一定是h2先碰到NULL:
如果环存在,h2与h1一定会相遇,而且相遇的点在环内:h2比h1遍历的速度快,一定不会在开始的那段非环的链表部分相遇,所以当h1,h2都进入环后,h2每次移动都会使h2与h1之间在前进方向上的差距缩小1,最后,会使得h1和h2差距减少为0,也即相遇
package org.myorg;
public class Test{
public static boolean isExsitLoop(SingleList a) {
Node<T> slow = a.head;
Node<T> fast = a.head; while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast)
return true;
}
return false;
}
public static void main(String args[]){
SingleList list = new SingleList();
for(int i=0;i<100;i++){
list.add(i);
}
System.out.print(SingleList.isExistingLoop(list));
}
}
复制代码 代码如下:
package org.myorg;
public class Node{
public Object data; //节点存储的数据对象
public Node next; //指向下一个节点的引用
public Node(Object value){
this.data = value;
}
public Node(){
this.data = null;
this.next = null;
}
}
复制代码 代码如下:
package org.myorg;
public class SingleList{
private int size;
private Node head;
private void init(){
this.size = 0;
this.head = new Node();
}
public SingleList(){
init();
}
public boolean contains(Object value){
boolean flag = false;
Node p = head.next;
while(p!=null){
if(value.equals(p.data)){
flag = true;
break;
}else(
p = p.next;
)
}
return flag;
}
public boolean add(Object value){
if(contains(value))
return false;
else{
Node p = new Node(value);
p.next=head.next;
head.next = p;
size++;
}
return true;
}
}
您可能感兴趣的文章:
- Java判断链表是否有环的两种实现方法
- java 验证用户是否已经登录与实现自动登录方法详解
- java 实现双向链表实例详解
- 队列基于链表和数组的实现方法(java)
- Java实现RSA算法的方法详解
- 单链表的Java实现(全方法)
- [置顶] 【JAVA】java中实现map集合的数据存取详解三种方法。Android程序员也是要会写的
- 单链表是否有环的问题解决与讨论(java实现)
- 【java项目实践】详解Ajax工作原理以及实现异步验证用户名是否存在(java版)
- Java8的HashMap详解(存储结构,功能实现,扩容优化,线程安全,遍历方法)
- Java实现SHA算法的方法详解
- Java Swing实现窗体添加背景图片的2种方法详解
- Java中的递归详解及实现方法
- Java使用JDBC实现Oracle用户认证的方法详解
- JAVA实现双向链表的增删功能的方法
- 【Java面试题】60 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?
- [置顶] 【JAVA】设计模式之懒汉式与恶汉式的单例模式实现的方法与详解
- 【JAVA】java中实现map集合的数据存取详解三种方法。Android程序员也是要会写的
- 数据结构与算法(2)---Java语言实现:线性表的单链表定义:方法补充,实现单链表反转,去重