题目:
如果一个链表中包含环,如何找出环的入口节点?
思路:
1.我们首先需要的就是确定一个链表中包含环,如何确定一个链表中有没有环呢,其实我么就可以用快慢指针法,一个快指针,一个慢指针,从同一个节点出发,如果最后两个节点重合了,那么就说明里面存在环。
2.确定有环后就可以想如何找到链表中环的入口,我们还是可以用双指针进行寻找,让两个指针同时指向链表头结点,先确定链表中环的接点数n,我们让一个指针p2向后移动n,然后再让两个指针p1和p2同样的速度遍历,当两个指针重合,重合的节点位置就是环的入口。
3.现在唯一的问题就是如何确定环的节点数n,我们之前说判断环的方法就是判断两个快慢指针是否会重合,重合的位置一定是环内的任何一个点,重合以后我们只需要在这个点用一个指针进行遍历,遍历一次记一次数,最后回到原点就可以记录环内有多少个节点。
代码实现:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *entryNodeOfLoop(struct ListNode *head) {
if(!head || !head->next) return NULL;
struct ListNode *first = head,*second = head;
while(first && second){
first = first->next;
second = second->next;
if(second) second = second->next;
else return NULL;
if(first == second){
first = head;
while(first != second){
first = first->next;
second = second->next;
}
return first;
}
}
return NULL;
}