#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;
}
判断链表中是否存在循环
最新推荐文章于 2023-10-15 19:27:59 发布