给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if(pHead == null)return null;
ListNode fast = pHead,slow = pHead;
//快慢指针判断有无环
while(true) {
if(fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}else {
return null;
}
if(fast == slow)break;//有环
}
//记录环中节点数
int count = 0;
while(true) {
slow = slow.next;
count += 1;
if(fast == slow)break;//找到环的节点数
}
fast = pHead;
slow = pHead;
//快指针先走count
for(int i = 0;i < count;i++) {
fast = fast.next;
}
//找到环入口,相当于快指针走了环节点数+pHead到环入口数,慢节点走了pHead到环入口数
while(true) {
if(fast == slow)
break;
fast = fast.next;
slow = slow.next;
}
return fast;
}