#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;
}
判斷鏈表中是否存在循環
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.