题目:如果一个链表中包含环,如何找出环的入口节点?
分析:定义两个变量记录当前的节点,同时从链表的头结点出发,一个一次走一步,另一个一次走两步。如果快的变量追上了慢的变量,那么链表就包含环。剩下的问题是如何确定环中节点的数量,从这个节点出发一边继续一边一边向前移动一边计数,当再次回到这个节点时,就可以得到环中节点数。
1.p1和p2在初始化的时候指向链表上的头节点
2.由于环中有四个节点,所以p1先在链表上向前移动四步
3.p1和p2按照相同的速度在链表上向前移动,直到他们相遇的节点就是环的入口节点
public ListNode EntryNodeOfLoop(ListNode pHead) {
ListNode meetingNode = MeetingNode(pHead);
int nodeNum = 1;
//确定节点数
ListNode numNode = meetingNode;
while (numNode.next != meetingNode) {
numNode = numNode.next;
nodeNum++;
}
ListNode p1 = pHead;
ListNode p2 = pHead;
for (int i = 0; i < nodeNum; i++) {
p1 = p1.next;
}
//直到p1和p2再次相遇就是环入口
while (p1.val != p2.val) {
p1 = p1.next;
p2 = p2.next;
}
return p1;
}
}