判断一个单链表是否是环,找到环的结合处

Linknode * createLink( int n )
{
    int xValue;
    Linknode *head,*p,*pre;
    cout<<"请输入第1个数字: ";
    cin>>xValue;
    p=(Linknode*)malloc(sizeof(Linknode));
    //p=new Linknode;
    p->data=xValue;
    p->next=NULL;
    head=p;
    pre=p;
    for(int i=1;i<n;i++)
    {
        cout<<"请输入第"<<i+1<<"个数字: ";
        cin>>xValue;
        p=(Linknode*)malloc(sizeof(Linknode));
        p->data=xValue;
        if(i==n-1)
        {
            /*cout<<"已经组成一个环了!"<<endl;*/
            p->next=head->next;
        }
        else
        {
            p->next=NULL;
        }
                                
        pre->next=p;
        pre=p;
    }
    //printLink(head);
    return head;
}



Linknode * findFirstCycleNode( Linknode *head )
{
    assert(head!=NULL&&head->next!=NULL);
    Linknode *pStart,*pCur;
    pCur=head;
    int nCur=0,nStart;
    //检查每一个结点,若是 null退出,不是一个环。
    while(pCur!=NULL)
    {
        pStart=head;
        nStart=0;
        while(pStart!=NULL)
        {
            if(pStart==pCur)
            {
                if(nStart==nCur)
                {
                    break;
                }
                else            //找到环的入口处了。
                {
                    cout<<"找到了,在第"<<nStart+1<<"节点处"<<endl;
                    return pStart;
                }
            }
            nStart++;
            pStart=pStart->next;
        }
        nCur++;
        pCur=pCur->next;
    }
                  
    cout<<"该链表不是一个环!"<<endl;
    return NULL;
}



Linknode * findFirstCycleNode2( Linknode *head )
{
    assert(head!=NULL&&head->next!=NULL);
    set<Linknode*>  addLinkNode;
    Linknode *pCur=head;
    while(pCur!=NULL)
    {
        if(addLinkNode.find(pCur)==addLinkNode.end())
        {
            addLinkNode.insert(pCur);
            pCur=pCur->next;
        }
        else
        {
            cout<<"该链表是一个环!"<<endl;
            return pCur;
        }
    }
    cout<<"该链表不是一个环!"<<endl;
    return NULL;
}


测试代码

Linknode *headNode;
    int n;
    cout<<"请输入创建的链表的长度"<<endl;
    cin>>n;
    headNode=createLink(n);
    //findFirstCycleNode(headNode);
    findFirstCycleNode2(headNode);


你可能感兴趣的:(链表)