您的位置:首页 > 其它

判断链表中是否存在循环

2013-08-12 17:15 302 查看
#include <stdio.h>
#include <stdlib.h>

typedef struct _node
{
int data;
struct _node* next;
}node,*list;

/*问题:如何判断一个单向链表是否存在循环?
这个问题很经典。
有两种方法来判断:
算法一:该算法使用步长法判断链表是否存在循环,
即设两个遍历,第一个遍历步长是第二个遍历的步长的两倍,如果这两个遍历相遇(遍历到统一个结点),则单链表有回路。*/
bool FindLoop(node* head)
{
node *p,*q;

if(NULL == head)
return 0;
p = head;
q = head->next;
while(q!=NULL && q->next!=NULL && p!=q)
{
p = p->next;
q = q->next->next;
}

if(p==q)
return true;
else
return false;
}
/*上面算法能过判断是否含有循环,但是它不能准确判断循环出现的位置。于是便有了算法2。
算法2不仅能够判断链表中是否含有循环,还能找出循环出现的具体位置。
算法2:当链表里当前的node的下一个node不是前面的任何一个node(包括自己),那么这个链表就不是循环链表*/
node *FindLoop2(node* head)
{
node *pc = head;
node *pf = NULL;
if(!pc)
return NULL;
while(pc)
{
pf = head;
while(pf && pf!=pc)
{
/*当前结点的下一个结点是它前面的某个结点或者是它自己,则为循环处。*/
if(pc->next == pf || pc->next == pc)
return pf;
pf = pf->next;
}
pc = pc->next;
}

return NULL;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: