1.判断链表是否有环
2.如果有环的话,如何找到环的入口
实现代码:
package linkList;
import java.io.ObjectInputStream.GetField;
public class isCircleTest<T> {
T item;
isCircleTest next;
public isCircleTest(T item,isCircleTest next) {
// TODO Auto-generated constructor stub
this.item=item;
this.next=next;
}
public static void main(String[] args) {
isCircleTest<String> first=new isCircleTest<String>("one",null);
isCircleTest<String> second=new isCircleTest<String>("two",null);
isCircleTest<String> third=new isCircleTest<String>("three",null);
isCircleTest<String> fourth=new isCircleTest<String>("four",null);
isCircleTest<String> fifth=new isCircleTest<String>("five",null);
first.next=second;
second.next=third;
third.next=fourth;
fourth.next=fifth;
fifth.next=third;
System.out.println(isCircle(first));
getEntrance(first);
}
//判断链表是否有环isCircle
public static boolean isCircle(isCircleTest t){
//定义快慢指针
isCircleTest fast=t;
isCircleTest slow=t;
//遍历链表。如果快慢指针指向了同一个元素,则说明有环
while(fast!=null&&fast.next!=null){
//变换快慢指针
fast=fast.next.next;
slow=slow.next;
if(slow.equals(fast)){ //相等则代表有环
return true;
}
}
return false; //否则代表无环
}
//找到有环链表的环入口getEntrance
public static void getEntrance(isCircleTest t){
//定义快慢指针和临时指针;
isCircleTest fast=t;
isCircleTest slow=t;
isCircleTest temp=null; //确认有环时才指向首节点
//遍历链表,先找到环(快慢指针相遇),准备一个临时指针,指向链表的首节点,继续遍历,直到慢指针和临时指针相遇;
//则相遇的节点就是环的入口
while(fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
if(slow.equals(fast)){ //如果有环
temp=t; //让临时指针指向首节点
continue; //继续循环
}
//让临时节点变换
if(temp!=null){
temp=temp.next;
//判断临时指针是否和慢指针相遇
if(temp.equals(slow)){
break; //找到入口,结束循环
}
}
}
System.out.println("环的入口是:"+temp.item); //输出入口值
}
}