题目讲解17 判断链表中是否有环
原题链接:
判断链表中是否有环_牛客题霸_牛客网
思路分析:
这题需要用到快慢指针算法。
第一步:创建两个指针,让它们都指向链表的头结点。
ListNode* slow, *fast;
slow = fast = head;
第二步:遍历链表,慢指针一次走一步,快指针一次走两步,如果链表有环的话,两个指针是一定会相遇的。这就像在操场上跑步一样,跑的快的肯定会再次看见跑的比他慢的。
开始循环之前:
第一次循环之后:
第二次循环之后:
第三次循环之后:
fast遇到了slow就说明有环,如果遍历完了链表还没有相遇,那就是链表无环。
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if(slow == fast)
{
return true;
}
}
return false;
完整代码:
typedef struct ListNode ListNode;
bool hasCycle(struct ListNode* head)
{
ListNode* slow, *fast;
slow = fast = head;
while(fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if(slow == fast)
{
return true;
}
}
return false;
}