题目:一个链表中包含环,如何找出环的入口节点。
思路:①假设链表中存在环,先求出环中的节点个数n。②用快慢指针找到环的入口:快指针先行走n步,慢指针再行走,当快慢指针相遇时,就是链表中环的入口。
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if(pHead == null){
return null;
}
ListNode meetingNode = MeetingNode(pHead);
if(meetingNode == null){
return null;
}
int count = 1;
ListNode pNode1 = meetingNode;
while(pNode1.next != meetingNode){
pNode1 = pNode1.next;
count++; //求出环中的节点个数
}
pNode1 = pHead;
for(int i=0;i<count;i++){
pNode1 = pNode1.next;
}
ListNode pNode2 = pHead;
while(pNode1 != pNode2){
pNode1 = pNode1.next;
pNode2 = pNode2.next;
}
return pNode1;
}
//在链表中存在环的前提下找到一快一慢指针相遇的节点
private static ListNode MeetingNode(ListNode pHead){
if(pHead == null || pHead.next == null){
return null;
}
ListNode pNode1 = pHead.next;
ListNode pNode2 = pNode1.next;
while(pNode1 != pNode2){
pNode1 = pNode1.next;
pNode2 = pNode2.next;
if(pNode2 != null){
pNode2 = pNode2.next;
}
}
return pNode2;
}