目的:判断一个链表中是否存在环状,如果链表有环,输出环的入口点。
实现思路:快慢循环;设置两个节点,都指向头结点位置,快的循环走两步,慢的循环走一步。
判断是否有环
public boolean isLoop(){
Node<T> fast=head;
Node<T> slow=head;
do{
if(fast==null||fast.next==null){
return false;
}
fast=fast.next.next;
slow=slow.next;
}while(fast!=slow);
return true;
}
输出入口点
public Node<T> Loop(){
Node<T> fast=head;
Node<T> slow=head;
do{
if(fast==null||fast.next==null){
return fast;
}
fast=fast.next.next;
slow=slow.next;
}while(fast!=slow);
Node<T> p=head;
Node<T> q=fast;
while (p!=q){
p=p.next;
q=q.next;
}
return q;
}