看到了两种方法:
1、快慢指针(slow和fast)
从头结点Head开始标记,慢指针走一步,快指针走两步,如果走的快的追上了走的慢的,就一定有环,如果走的快的走到了链尾也没有追上走的慢的,则一定不是环形链表
//判断链表是否有环
bool IsLoop(NODE *head)//假设为带头节点的单链表
{
if(head=NULL)
return false;
NODE *slow=head->next;//初始时慢指针从头结点走一步
if(slow=NULL)
return false;
NODE *fast=slow->next;//初始时快指针从头结点开始走两步
while(fast != NULL & slow!=NULL)//当链表没有环时,循环到链尾结束
{
if(fast==slow)
return ture;
slow=slow->next;
if(fast !=NULL)
fast = fast->next;
}
return false;
}
(2) 通过使用STL中的map表进行映射,首先定义map<NODE *,int>m;将NODE*指针映射成数组下标,并赋值为一个int类型的数值。然后从链表的头指针开始往后遍历,每次遇到一个指针P,就判断m[p]是否为0,如果为0,就将m[p]的值赋为1,表示第一次访问,而如果m[p]的值为1,则说明这个节点已经被访问过一次了,于是就形成了环。
伪代码:
map<NODE*,int>m;
bool_IsLoop_2(NODE *head)
{
if(head ==NULL)
return false;
NODE *p=head;
while(p)
{
if(m[p]==0)//一般默认值都是0;
else if (m[p] == 1)
return ture;
p=p->next;
}
return false;
}