如果单链表有环,按照判断是否有环的思路,当快指针和慢指针相遇时,slow指针肯定没有遍历完链表,而fast指针已经在环内循环了n圈。假设slow指针走了s步,则fast指针走了2*s步,设环长为r,则:
2*s=s+n*r;
s=n*r;
设链表头到环入口距离为l,入口处距离相遇点距离为a,则:
s=l+a+mr;
得:l=(n-m)r - a
可见,相遇后,如果在链表头和相遇点各设置一个指针,每次走一步,两指针必定相遇,且在相遇第一个点为环入口。
public class findloopport {
public Node method(Node head) {
Node slow=head,fast=head;
while(fast!=null&&fast.next!=null) {
slow=slow.next;
fast=fast.next.next;
if(fast==slow) {
break;
}
}
if(fast==null||fast.next==null) {
return null;
}
slow=head;
while(slow!=fast) {
slow=slow.next;
fast=fast.next;
}
return fast;
}
}