浅析有关链表的带环问题

概要:
有关链表带环问题的面试题:
*判断一个链表是否带环?
*求环的长度?
*求环的入口点?

1、判断链表是否带环?

这里写图片描述

//判断一个链表是否带环
    //思路:快慢指针,返回相遇点
    Node* IsCircle(Node* head)
    {
        if (head == NULL)
        {
            return NULL;
        }
        Node* pFast = head;
        Node* pSlow = head;
        //快指针一次走两步,慢指针一次走一步
        while (pFast && pFast->_next)
        {
            pFast = pFast->_next->_next;
            pSlow = pSlow->_next;
            if (pFast == pSlow)
            {
                break;
            }
        }
        if (pFast && pFast->_next)
        {
            return pFast;
        }
        return NULL;
    }

2、求环的长度?

若带环,求环的长度?
从相遇点的下一个节点开始遍历链表,每走一步统计一次,直到遇到相遇点就停止,统计的次数就是环的长度。
需要注意的是:因为是从相遇点的下一个节点开始遍历,所以计数器的初始值需要给1.

这里写图片描述

size_t lengthOfCircle(Node* meetNode)
    {
        assert(meetNode);
        size_t count = 1;//注意初始值
        Node* cur = meetNode->_next;
        while (cur != meetNode)
        {
            count++;
            cur = cur->_next;
        }
        return count;
    }

3、求环的入口点?

这里写图片描述

Node* GetEntryNode(Node* head, Node* meetNode)
    {
        assert(head && meetNode);
        Node* p1 = head;
        Node* p2 = meetNode;
        while (p1 != p2)
        {
            p1 = p1->_next;
            p2 = p2->_next;
        }
        return p1;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值