判断链表中是否存在循环

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

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