给定一个链表,判断链表中是否有环。
链表中有一个环,其尾部连接到第二个节点。
输入:head = [3,2,0,-4], pos = 1
输出:true
思路
本方法需要对「Floyd 判圈算法」(又称龟兔赛跑算法)有所了解。
设置一个快指针,一个慢指针,连个指针一块往后走,如果有环,快指针一定会先进入环,然后一直在环里移动,慢指针后面进来的时候,一定会和快指针在环内相遇。
如果没有环,快指针就会先到达尾结点。
bool hasCycle(struct ListNode *head) {
if(head==NULL||head->next==NULL) return false;
struct ListNode *fast=head->next;
struct ListNode *slow=head;
while(fast!=slow)
{
if(fast==NULL||fast->next==NULL) return false;
fast=fast->next->next;
slow=slow->next;
}
return true;
}
为什么我们规定初始时慢指针在位置 head,快指针在位置 head.next,而不是两个指针都在位置 head,因为如果都在head,就不会进入循环了。