单链表是否有环

10 篇文章 0 订阅
4 篇文章 0 订阅
                1,实现思路

如何判断一个单链表是否有环?
我们可以定义两个指针,第一个指针一次遍历一步,第二个指针一次遍历两步,如果第二个指针指向NULL,则单链表无环,如果第二个指针与第一个指针相遇,则说明有环。

                2,代码实现
LNode* HasCircle(LNode *phead)
{
    if(phead == NULL) return NULL;
    LNode *pFast = phead;
    LNode *pSlow = phead;

    while(pFast != NULL && pFast->next != NULL)
    {
        pFast = pFast->next->next;
        pSlow = pSlow->next;
        if(pFast == pSlow)
            return pFast;
    }
    return NULL;
}

如果有环,返回环的入口地址。

                3,实现思想

如果有环,通过返回相遇的节点,我们可以求出环的长度,然后我们定义两个指针,第一个指向头结点,并且向后遍历环的长度,第二个指针指向头结点,然后两个指针开始同时向后遍历,当两个指针相等的时候,此时的地址就是环的入口地址。

                4,代码实现
LNode *searchEntranceNode(LNode *phead)
{
    LNode *MeetNode = HasCircle(phead);
    if(MeetNode == NULL) return NULL;
    LNode *pNode1 = MeetNode->next;
    int length = 1;  //环的长度
    while(pNode1 != MeetNode)
    {
        pNode1 = pNode1->next;
        ++length;
    }
    pNode1 = phead;
    while(length--)
    {
        pNode1 = pNode1->next;
    }
    LNode *pNode2 = phead;
    while(pNode1 != pNode2)
    {
        pNode1 = pNode1->next;
        pNode2 = pNode2->next;
    }
    return pNode1;
}
                5,总结单链表

链表的操作在很多方面都会用到指针,如果一个指针不够用,可以用两个指针来实现,比如找单链表的第K个节点,找单链表的中间节点,找两个单链表的相交节点(下一篇博客实现)等等都会用到快慢指针,所以掌握快慢指针的用法,真的很重要!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值