题目要求:
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。
示例:
一.判断是否有环
判断是否有环的方法就是定义两个指针,一个快指针,一个慢指针,快指针一次走两步,慢指针一次走一步,如果走到某一位置时,快指针和满指针相同,那么就可以证明有环。
具体如下:
代码如下:
bool hasCycle(struct ListNode *head) {
struct ListNode *slow=head;
struct ListNode *fast=head;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
{
return true;
}
}
return false;
}
二.寻找开始入环的第一个节点
建立一个新的指针指向相遇的结点,相遇的结点就是第一次入环的结点的前一个,
整体代码如下:
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode *slow,*fast;
slow=fast=head;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
{
struct ListNode *meet=slow;
while(meet!=head)
{
meet=meet->next;
head=head->next;
}
return meet;
}
}
return NULL;
}