这也是一道在链表中找环的题目,但是,它稍微要复杂一点,不但要判断是否存在环,还要找出入环的第一个节点。 首先还要使用快慢指针的方式找出第一次相遇的节点,这时当前指针距离入环的节点位置,和从头节点到入环节点位置的距离相同。因此,只要将其中一个节点指针指向头节点,两个指针同时移动,当他们相遇的位置,就是入环的第一个节点。
下面是C语言实现的算法:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode *slow = head;
struct ListNode *fast = head;
// 首先判断相遇的节点
while (fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) {
break;
}
}
if (fast != NULL && fast->next != NULL) {
// 存在环,且在环上相遇了
slow = head;
while (slow != fast) {
slow = slow->next;
fast = fast->next;
}
return slow;
}
return NULL;
}