题目:
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。
解答:
步骤:
- 找到环内的相遇点
- 一个指针从起始节点开始,一个指针从相遇点开始
- 两个指针的相遇位置即为入口节点
struct ListNode * hasCycle(struct ListNode *head)
{
struct ListNode *fast,*slow;
// 两个快慢节点必须从同一位置开始遍历
// 不同时遍历,最终两个指针始终追不上,导致死循环
slow=head;
fast=head;
while(fast && fast->next)
{
fast=fast->next->next;
slow=slow->next;
// 节点相遇位置
if(fast==slow)
return fast;
}
return NULL;
}
struct ListNode *detectCycle(struct ListNode *head)
{
// 得到相遇点
struct ListNode *cur=hasCycle(head);
if(cur)
{
while(cur)
{
// 两个指针相遇,即找到入口节点
if(cur==head)
return cur;
cur=cur->next;
head=head->next;
}
}
return NULL;
}