链表有环的定义:单链表的尾节点指向了链表中间的某个结点。
如图所示:
结点3就是环的入口点
思路:
我们采用快慢指针fast和slow来进行判断。
这两个指针初始值均指向头,slow每次向前一步,fast每次向前两步,slow每次向前一步,如果该单链表有环,则它们必定会在环中相遇。
如果fast遍历到尾部为NULL则无环。
DNode* IsCircle(DList plist)
{
DNode* slow=plist;
DNode* fast=plist;
while(fast->next!=NULL &&fast->next->next!=NULL)
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
{
return fast;
}
}
return NULL;
}
怎么找到环的入口点?
在链表头,相遇点分别设定一个指针,每次各走一步,两个指针必定相遇,则相遇的第一点为环的入口点。
DNode* IsJiao(DList plist)
{
if(IsCircle(plist)!=NULL)
{
DNode *p=IsCircle(plist);
DNode *q=plist;
while(1)
{
p=p->next;
q=q->next;
if(p==q)
{
return p;
}
}
}
return NULL;
}