找出链表中是否存在循环链表以及开始位置

本文介绍了一种利用双指针技术检测链表中是否存在环,并定位环的起始点的算法。通过设置快慢两个指针,快指针每次移动两步,慢指针每次移动一步,若存在环,则快指针最终会追上慢指针;若不存在环,快指针将到达链表末尾。在确定存在环后,从头节点和相遇点同时出发,再次相遇即为环的起始点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本思路是 : 设置两个前后指针 , 前指针每次前进2 , 后指针每次前进1 , 如果存在一个环 , 必然会在某个时刻前指针追上后指针 , 如果不存在环 , 则前指针碰到末尾就直接结束了(到这里是检测是否存在一个环)

 

        ListNode fast,slow;
        fast = slow = head;
        
        while(fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow)
                break;
        }
        if(fast == null || fast.next == null)
            return null;

上述如果不存在则会返回null , 如果存在则继续下一步

因为2个指针从同一个节点同时出发的 , 在存在环的情况下 , 当两个指针相遇时 , 

设后指针速度为v , 经历时间为t , 则前指针速度为2v , 时间为t , 将所有路程分成3段 , 第一段是在环外的路程s1 (这段路程2个指针都要经历) , 第二段是后指针在环内经历的路程s2 , 第三段为后指针在环内未走完整个环的路程s3

v * t = s1 + s2;

2 * v * t = s1 + s2 + s3 + s2;

两式相减可以知道 , s1 = s3

也就是说共同路段(s1) = 后指针在环内未走完的路程

那么从起始点 , 相遇点同时出发 , 一个点一个点走过去 , 最后肯定会在环的起始点相遇

        slow = head;
        while(fast != slow){
            fast = fast.next;
            slow = slow.next;
        }
        return fast;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值