尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Floyd判圈和Brent判圈

Floyd判圈和Brent判圈
📅 发布时间:2026/6/17 22:24:52

问题背景

想象一个链表,它可能在某个节点处指向一个之前的节点,从而形成一个环。

我们的目标是:

  • 判断链表中是否存在环。

  • 找到环的入口点。

  • 计算环的长度。

比如说这个:

1 -> 2 -> 3 -> 4 -> 5 -> 6^         ||         v9 <- 8 <- 7

节点 \(4\) 即为环的入口点,环的长度为 \(6\)。

Floyd 判圈算法 (龟兔赛跑算法)

使用两个指针,一个慢指针(乌龟)和一个快指针(兔子)。

慢指针:每次移动一步。

快指针:每次移动两步。

判断是否有环的原理:如果链表中存在环,那么快指针最终会追上慢指针(在环内相遇)。如果不存在环,快指针会先到达链表尾部。

算法步骤如下:

  • 初始化:

    • 指针 \(slow\) 和 \(fast\) 都指向链表头节点。
  • 移动阶段:

    • 在每一步中,\(slow\) 向后移动一个节点。
    • \(fast\) 向后移动两个节点。
    • 检查 \(fast\) 或 \(fast.next\) 是否为 \(null\)。如果是,则链表无环,算法结束。
    • 检查 \(slow\) == \(fast\)。如果相等,则链表有环。
  • 寻找环入口:

    • 当 \(slow\) 和 \(fast\) 第一次相遇时,将其中一个指针重新指向链表头。
    • 然后,两个指针都以每次一步的速度移动。
    • 当它们再次相遇时,相遇的节点就是环的入口点。

那问题来了,为什么重新指向头节点后,再次相遇的点就是环入口?

我们设链表头到环入口的距离为 \(A\),环入口到第一次相遇点的距离为 \(B\),第一次相遇点回到环入口的距离为 \(C\)。

那么环的长度 \(L = B + C\)。

在第一次相遇时:

慢指针走过的路程:\(A + B\)。

快指针走过的路程:\(A + B + k * L\)(其中 \(k\) 是快指针在环内转的圈数)。

由于快指针速度是慢指针的两倍,所以路程也是两倍,所以 \(2(A + B) = A + B + k * L\),\(A = k * L - B\)。

将 \(L = B + C\) 代入:\(A = k * (B + C) - B\),\(A = (k-1) * L + C\)。

从链表头(\(A\))到环入口的距离,等于从第一次相遇点(\(C\))绕 \((k-1)\) 圈再回到环入口的距离。

所以,一个指针从链表头走 \(A\) 步,另一个指针从相遇点走 \(C + (k-1)*L\) 步,它们最终会在环入口点相遇。

Brent 判圈算法

通常比 Floyd 有更低的时间常数,但好像没啥人学啊。

使用一个慢指针和一个快指针,但快指针不是连续移动,而是“跳跃式”移动。

慢指针:保持不动,直到快指针需要“跳跃”到它的位置。

快指针:每次移动一步,但每走一段距离(\(step_limit\)),如果还没遇到慢指针,就将 \(step_limit\) 翻倍,并把慢指针移动到快指针的当前位置。

算法步骤如下:

  • 初始化:
    • \(slow\) = \(head\), \(fast\) = \(head\)
    • \(step_limit = 2\) (初始的移动限制)
    • \(steps_taken = 0\) (记录当前周期内已走的步数)
  • 移动阶段:
    • \(fast = fast.next\) (快指针走一步)
    • \(steps_taken += 1\)
    • 检查 \(fast == slow\)。如果相等,则发现环。
    • 检查 \(steps_taken == step_limit\)。
    • 如果相等,说明当前周期走完了。将 \(slow\) 移动到 \(fast\) 的位置(让乌龟跳到兔子当前位置)。将 \(step_limit *= 2\),并将 \(steps_taken\) 重置为 \(0\)。

寻找环入口和长度:

一旦检测到环(\(fast\) == \(slow\)),环的长度就是此时 \(steps_taken\) 的值(因为 \(slow\) 没动过,\(fast\) 走了 \(steps_taken\) 步追上它)。

要找到环入口,可以将两个指针都重置为头节点,然后让一个指针先走环长度步,然后两个指针同时一步一步走,相遇点就是入口啦。

可以自由转载

相关新闻

  • 2025年石棉橡胶板厂家联系方式汇总:专业服务与产品解析
  • 智表ZCELL产品V3.4 版发布,新增区域筛选、字母列参等功能。
  • 元推理品析:自指有机,自洽有缘

最新新闻

  • 上海二手包回收 4 大套路曝光!看懂再出手,少亏大几千 - 逸程
  • StringBuilder 和 StringBuffer
  • 用代码生成神经网络结构图:PlotNeuralNet实战指南
  • 2026年众智商学院SCMP7月考试资料怎么准备?报名材料和备考安排说明 - 众智商学院官方
  • iCloud照片批量下载终极指南:3种模式高效备份你的珍贵回忆
  • Kubuntu 26系统安装RTX 5070显卡驱动完整指南与避坑要点

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号