如何计算环的入口
输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。
1.首先我们要判断是否有环,常用方法双指针法,只要有环,快慢指针一定会相遇
public boolean hasCycle(ListNode head) {
ListNode fast=head,slow=head;
while(fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
if(fast==slow){
return true;
}
}
return false;
}
2.计算环的大小,一个指针不动,另一个指针跑,知道两个指针再次相遇
slow=slow.next;
int len=1;
while(slow!=fast){
len++;
slow=slow.next;
}
3.两个指针再从起点开始跑,快指针先跑换的长度,慢指针在开始跑,两个指针一定在环入口相遇
fast=slow=head;
while(len-->0){
fast=fast.next;
}
while(fast!=slow){
fast=fast.next;
slow=slow.next;
}
代码整合
public ListNode detectCycle(ListNode head) {
ListNode fast=head,slow=head;
boolean b=false;
while(fast!=null&&fast.next!=null){
fast=fast.next.next;
slow=slow.next;
if(slow==fast){
b=true;
break;
}
}
if(!b){
return null;
}
slow=slow.next;
int len=1;
while(slow!=fast){
len++;
slow=slow.next;
}
fast=slow=head;
while(len-->0){
fast=fast.next;
}
while(fast!=slow){
fast=fast.next;
slow=slow.next;
}
return fast;
}
}