链表的有环无环性,也即是否尾部的 next 指向 head,是否首尾相连。
要求不能使用标志位,最多只能用两个额外指针。
思路:设置两个指针,一个每次递增一步,一个每次递增两步,如果有环的话,二者必然重合;如果无环,快指针走到最后,程序会退出。
struct Node
{
int val;
Node* next;
};
bool check(Node* head)
{
if (!head) return false;
Node *low = head, *fast = head->next;
while (!fast && !fast->next)
{
low = low->next;
fast = fast->next->next; // 能进入循环,走到这一步,必然说明,fast->next 不为空,
if (fast == low)
return true; // 突然死亡法
}
return false;
}