判斷鏈表中是否存在循環

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章