链表是否有环

判断链表是否有环,目前有两种主流的方法,一种是设置两个指针,一个步进量是1,另一个步进量是2,如果存在环,则步进量为2的指针一定能追赶上步进为1的指针,即在某一时刻它们的地址相同,代码如下:

复制代码
bool check(const node* head) 
{
if(head==NULL) return false;
node *low=head, *fast=head->next;
while(fast!=NULL && fast->next!=NULL)
{
low=low->next;
fast=fast->next->next;
if(low==fast)
return true;
}
return false;
}
复制代码

另一种方法是遍历链表,没遍历一个节点,就给这个节点计数,如果某节点入度超过1,则说明链表有环。但是如果链表结构本身没有存储入度的空间,则需要辅助存储空间。例如可以用哈希表保存节点地址和入度的映射,但这需要O(n)的辅助存储空间

原文地址:https://www.cnblogs.com/Evil-Rebe/p/5863862.html