在不破坏链表的情况下,通过两个指针,一个每次走过两个节点,另一个每次走过一个节点,即快慢指针。如果存在环路,那么快的指针会先走入环中,开始它的环绕之旅,等到慢的指针进入了环内,不论快指针在哪,慢指针相对于快指针是有一定的位置领先的,但是快指针每次都追上满指针一个身位,会在慢指针没有全部走完这一圈时追上慢指针。当两个指针重合时,那么说明这个链表有环,如果快指针有指向nullptr时,这个链表就是没有环的。
class Solution {
public:
bool hasCycle(ListNode *head) {
if (head == nullptr || head->next == nullptr) return false;
if (head->next == head) return true;
ListNode *slow = head, *fast = head->next;
while (fast != nullptr) {
if (fast == slow) return true;
fast = fast->next;
if (fast == nullptr) return false;
fast = fast->next;
slow = slow->next;
}
return false;
}
};