当前位置: 首页 > news >正文

C++————快慢双指针寻找链表循环

在链表中寻找循环点可以使用双指针法,也就是著名的弗洛伊德判圈算法(Floyd's Cycle-Finding Algorithm)。此算法运用两个指针,一个快指针和一个慢指针,借助它们移动速度的差异来判断链表是否存在循环,若存在则找出循环点。

下面是该算法的实现步骤:

  1. 初始化指针:让慢指针 slow 和快指针 fast 都指向链表的头节点。

    ListNode* slow = head;
    ListNode* fast = head;
  2. 判断循环:慢指针每次移动一步,快指针每次移动两步。要是链表存在循环,那么快指针必然会追上慢指针;要是快指针抵达链表末尾(即 fast 或者 fast->next 为 null),就表明链表不存在循环。

     // 检测是否存在循环
        while (fast && fast->next) {
            slow = slow->next;
            fast = fast->next->next;
            // 快慢指针相遇,说明存在循环
            if (slow == fast) {
            }
        }

    如果链表有末尾那肯定就不存在循环了。既然有循环,因为快指针每次走2,慢指针每次走了,相当于快指针在慢指针后面追慢指针且每次移动快慢间的距离都减少1,所以必然存在快慢指针相遇的点。

  3. 寻找循环点:当快慢指针相遇时,将慢指针重新指向链表的头节点,然后让慢指针和快指针以相同的速度(每次移动一步)继续移动,它们再次相遇的节点就是循环点。

    // 检测是否存在循环
        while (fast && fast->next) {
            slow = slow->next;
            fast = fast->next->next;
            // 快慢指针相遇,说明存在循环
            if (slow == fast) {
                // 慢指针重新指向头节点
                slow = head;
                while (slow != fast) {
                    slow = slow->next;
                    fast = fast->next;
                }
                return slow;
            }
        }
        // 没有循环
        return nullptr;

 循环的长度L=b+c;

  • 慢指针:设慢指针走过的路程为 (S_{slow}),因为慢指针每次移动一步,所以 (S_{slow})=a + b。
  • 快指针:设快指针走过的路程为 (S_{fast}),快指针每次移动两步,由于快指针在慢指针进入循环后又多走了若干圈才和慢指针相遇,设快指针在循环里绕了 n 圈,那么(S_{fast}=a + b + nL=a + b+ n(b + c))
  • S fast =2S slow(a + b+ n(b + c)=2(a + b)),对该等式进行化简:
    (a + b+ n(b + c)=2a + 2b),
    a= n(b + c)-b=(n - 1)(b + c)+c。
  • 如此可见当快指针回到头部并且变为慢指针后,当快指针走到循环点后,慢指针走了a,也就是走了(n - 1)(b + c)+c,即n-1圈和一个c,走到了进入循环的地方,此时两指针相遇返回相遇点。

相关文章:

  • 国家网络安全事件应急预案
  • mapbox高阶,结合threejs(threebox)添加extrusion挤出几何体,并添加侧面窗户贴图和楼顶贴图,同时添加真实光照投影
  • 我与DeepSeek读《大型网站技术架构》(13)- 大型网站典型故障案例分析
  • 【MyBatis Plus JSON 处理器简化数据库操作】
  • 手写svm primal form形式
  • windows下搭建postgresql的流式数据库vector
  • 技术速递|.NET 9 中的 .NET MAUI 性能特性
  • AWS云编排详解-Cloud Formation
  • 个性化音乐推荐系统
  • 【Linux】centos配置可用的yum源
  • 影刀RPA安装32位与64位的差别
  • SpringBoot第一天
  • Spring MVC面试题(一)
  • 基于Spring Boot的网上蛋糕售卖店管理系统的设计与实现(LW+源码+讲解)
  • IIC通信协议详解与STM32实战指南
  • MySQL数据库复制
  • 轻量级嵌入式WebRTC开发:音视频通话EasyRTC纯C语言实现SFU/MCU架构与QoS优化
  • ENSP实验案例-企业局域网搭建实施设计方案(计算机毕业设计作品)
  • 使用 Golang 操作 MySQL
  • 版本控制器Git(2)
  • 前4个月全国新建商品房销售面积降幅收窄,房地产库存和新开工有所改善
  • 半数以上中国人都缺这几种营养,吃什么能补回来?
  • 19世纪的“表征之场”:弗洛伊德的精神分析椅
  • 不赚“快钱”的佳沛:蒋时杰解密新西兰国果如何在中国“慢养”出43亿生意
  • 上海这个咖啡文化节首次“走出去”,率本土品牌亮相英国伦敦
  • 《风林火山》千呼万唤始出来,戛纳首映后口碑崩盘?