找到链表中循环的起始节点?

2024-02-26

如何在给定的链表中找到循环的起始节点?我们称其为循环点

到目前为止,我已经了解以下内容(使用慢/快指针):

  1. 假设列表有一个非循环部分的大小k
  2. 缓慢移动 k 步
  3. 快速移动 2k 步
  4. 快的是 (2k - k)=k steps ahead of slow
  5. 慢是在循环的开始;也称为Cycle point
  6. fast is (LOOP_LENGTH - k) steps behind from Cycle point或此时的慢指针
  7. 缓慢移动每 1 步,快速移动 2 步,慢速移动 1 步。
  8. 因此,需要快速(LOOP_LENGTH - k)脚步缓慢相遇并碰撞
  9. 这是我不明白的步骤:在这个碰撞点,两个节点都会k从循环的前面开始的步骤。
  10. 一旦找到碰撞点,将一个指针移动到列表的头部。
  11. 现在以 1 步/转的速度移动两个指针直到碰撞。它们相遇的节点是循环的开始,因此Cycle point

有人可以解释一下第 9 步及其之后的内容吗?

Thanks

EDIT:

我想指出的一件事是,一旦进入循环,快指针永远不会超过慢指针。他们会发生碰撞。原因如下:慢速假设为 i,而快速假设为 i-1。当它们移动时,slow=> i+1,fast也将在i+1,因此发生碰撞。或者,慢速位于 i,快速位于 i-2。下一步,慢-> i+1;快:i.下一步,慢-> i+2,快:i+2,因此再次碰撞。太快的永远无法超越慢的,只会在循环内碰撞一次!


你的6.错了,快指针距离当时处于循环点的慢指针还有k步;但更好地利用ahead or behind代替away. Plus, k可能更小、更大或等于loop_length.

所以,快速指针是k当到达循环点时,它会领先于慢速循环,根据您的假设,k开始后的步骤。现在,在循环上测量,快速指针是k % loop_length比循环点提前的步数。正确的?如果k = some_n * loop_length + r,快速指针为r比循环点提前一步,也就是说,r := k % loop_length领先一步。

但这意味着慢指针是loop_length - r steps 领先于快者,沿着环路。这是一个loop毕竟。所以之后loop_length - r快指针将追上慢指针的附加步骤。对于每一步,慢速指针移开,快速指针移近two steps.

所以我们不知道k,我们不知道loop_length or r,我们只知道m = k + loop_length - r = some_n * loop_length + r + loop_length - r = (some_n+1) * loop_length。总步数m直到两个指针的交汇点是循环长度的倍数。

所以现在我们重新开始,在开始处使用一个新指针,在与快指针相遇的地方使用慢指针,m走在新的前面。我们以相等的速度移动新指针和慢指针,每次移动 1 步,并且在循环点它们将相遇 - 因为当新指针到达循环点时,秒仍然是m领先一步,也就是说,m % loop_length == 0沿着环路向前迈进。这样我们就能知道什么k是(我们一直在计算步数),以及循环点。

我们发现loop_length沿着循环再走一遍,直到两者再相遇一次。

  • 也可以看看:http://en.wikipedia.org/wiki/Cycle_detection#Algorithms http://en.wikipedia.org/wiki/Cycle_detection#Algorithms
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

找到链表中循环的起始节点? 的相关文章

  • 为什么 LinkedList 通常比 List 慢?

    我开始在我的一些 C 算法中使用一些 LinkedList 而不是列表 希望能够加快速度 然而 我注意到他们只是感觉更慢 像任何优秀的开发人员一样 我认为我应该尽职调查并验证我的感受 所以我决定对一些简单的循环进行基准测试 我认为用一些随机
  • 如何随机打乱地图中的值?

    我有一个 std map 其中键和值均为整数 现在我想随机打乱地图 因此键随机指向不同的值 我尝试了 random shuffle 但它无法编译 请注意 我并没有尝试洗牌键 这对于地图来说没有意义 我正在尝试随机化这些值 我可以将这些值推入
  • 将矩形分组到网格中

    我有一个随机切片的矩形网格 宽度为 80 单位 我已经将网格每一行的可用空间存储在如下数组中 pX 1 sX 15 pX 30 sX 13 pX 43 sX 1 pX 44 sX 17 pX 1 sX 15 pX 16 sX 14 pX 3
  • 如何计算某物是否位于某人的视野中

    我有一个对象 它在 2D 空间中具有位置和速度 两者都由向量表示 对象的视野每侧均为 135 度 它看起来与移动的方向相同 速度矢量 我有一些对象 其在 2D 空间中的位置由向量表示 在图中 蓝色背景上的对象是可见的 红色背景上的对象对主体
  • 在 Celery 中,我如何运行一个任务,然后让该任务运行另一个任务,并保持下去?

    tasks py from celery task import Task class Randomer Task def run self kwargs run Randomer again return random randrange
  • MongoDB 全文搜索分数“分数是什么意思?”

    我正在为我的学校开发一个 MongoDB 项目 我有一个句子集合 我进行正常的文本搜索以查找集合中最相似的句子 这是基于评分的 我运行这个查询 db sentences find text search any text score met
  • 检查列表是否已排序的 Pythonic 方法

    有没有一种Python式的方法来检查列表是否已经排序ASC or DESC listtimestamps 1 2 3 5 6 7 就像是isttimestamps isSorted 返回True or False 我想输入一些消息的时间戳列
  • 找出区间内绝对差值最小的两个元素

    我给定了一个数组和一个 L R 类型的查询列表 这意味着找到任何两个数组元素之间的最小绝对差 使得它们的索引在 L 和 R 之间 其中数组的起始索引是 1 而不是 0 例如 采用包含元素 2 1 8 5 11 的数组 a 则查询 1 3 将
  • 创建简单和弦进行的算法

    我正在制作一个程序 根据 C 大调音阶的随机基本和弦进行生成随机简单的旋律 从这个音阶生成 4 个三和弦的和弦进行的好方法是什么 从音阶中生成 4 个完全随机的三元组 从 7 个现有的三元组中 通常听起来不太好 我需要一种方法来生成听起来不
  • JAVA实现AVL树

    我想用Java实现一个AVL树 这是我到目前为止所拥有的 public class AVLNode private int size The size of the tree private int height The height of
  • 如何判断鼠标指针是否位于贝塞尔曲线和直线定义的路径内?

    我有一条由多条贝塞尔曲线和直线段组成的闭合路径 如何判断鼠标指针的当前位置是在路径内部还是外部 Example of mouse leaving the area Example of mouse entering the area 首先
  • 在哪里可以了解有关“蚁群”优化的更多信息?

    我已经阅读了一段时间关于使用 蚁群 模型作为优化各种类型算法的启发式方法的内容 然而 我还没有找到一篇文章或书籍以介绍性的方式甚至详细地讨论蚁群优化 谁能给我指出一些资源 让我可以更多地了解这个想法 如果你懂德语 是的 抱歉 我和一个朋友写
  • 在逻辑回归中使用排名数据

    当我努力学习这些概念时 我将对此给予最大赏金 我正在尝试在逻辑回归中使用一些排名数据 我想使用机器学习来制作一个简单的分类器来判断网页是否 好 这只是一个学习练习 所以我不期望有很好的结果 只是希望学习 过程 和编码技术 我已将数据放入 c
  • 面试问题 - 在排序数组 X 中搜索索引 i,使得 X[i] = i

    昨天面试时 我被问到了以下问题 考虑一个 Java 或 C 数组X它已排序并且其中没有两个元素是相同的 如何最好地找到索引i这样该索引处的元素也是i 那是X i i 作为澄清 她还给了我一个例子 Array X 3 1 0 3 5 7 in
  • 如何生成排列?

    我的问题是 给定一个长度为 n 的列表 L 和一个整数 i 使得 0 对于任意 i 和任意 2 个列表 A 和 B perm A i 和 perm B i 都必须将 A 和 B 的第 j 个元素映射到 A 和 B 相同位置的元素 对于任何输
  • 如何计算列表的最小不公平性总和

    我试图将问题陈述总结如下 Given n k和一个数组 列表 arr where n len arr and k is an integer in set 1 n inclusive 对于数组 或列表 myList 不公平总和定义为sum中
  • 如何计算python 2D散点占用面积

    我使用 matplotlib 绘制了这两个 2000 个点的序列 从图片上看 前2000点占用的面积比后2000点要小 但如果我想定量计算2000个点的第一序列和第二序列占用了多少面积 该怎么办 我真的很感谢任何帮助 建议或意见 非常感谢
  • 比 in_array 更快?

    我需要将一个值与一组数组进行比较 但是 我需要比较 foreach 中的多个值 如果使用 in array 它可能会很慢 非常慢 有没有更快的替代方案 我当前的代码是 foreach a as b in array b array 谢谢 你
  • 生成字符串及其子字符串列表的排列的算法

    我已经忘记这个算法有一段时间了 假设我得到了字符串 cccaatt 我试图生成重复字母的每个子串的所有可能变体 EG cccaatt 作为输入将返回 猫 卡特 猫 卡特 ccat 卡特 卡特彼勒 卡特彼勒 cccat cccat cccaa
  • Dijkstra 算法不生成最短路径?

    我正在使用 Dijkstra 算法解决最短路径问题 我遇到了麻烦 因为该算法应该提供最短路径 但运行该算法后 我手动得到了一条短路路径 这只是该算法的副产品吗 我尝试生成的路径是从 a gt z 这是我通过应用该算法得到的路径 在我访问的每

随机推荐

  • 未定义参考[重复]

    这个问题在这里已经有答案了 当我编译链接列表的代码时 我收到一堆未定义的引用错误 代码如下 我一直在编译这两个语句 g test cpp 也 g LinearNode h LinearNode cpp LinkedList h Linked
  • Google 字体粗细 300 不起作用

    在 Chrome 或 Chrome Canary 中工作时 无法打开 google fonts open 的 300 字重 我已经尝试过了this https stackoverflow com questions 20525609 fon
  • 如何在 Node.js 中根据 XML 验证 DTD

    如何根据 Node js 中的特定 XML 验证 DTD 我有一个端点 其中包含每个 XML 负载的 DTD 但试图找到一个可以使用 Node 进行模式验证的良好解决方案 这是一篇旧文章 但现在我们可以这样做节点Libxml https w
  • System.BadImageFormatException:无法加载文件或程序集[重复]

    这个问题在这里已经有答案了 C Windows Microsoft NET Framework64 v4 0 30319 gt InstallUtil exe C PRODUKCIJA D ebug DynamicHtmlTool exe
  • 将 WasapiLoopbackCapture wav 音频流转换为 MP3 文件

    我能够在 WasapiLoopbackCapture naudio 的帮助下捕获由扬声器生成的系统音频 但问题是它捕获 wav 文件并且 wav 文件的大小非常大 几乎 10 到 15 MB 分钟 我必须捕获 2 3 小时的音频 这太长了
  • 我不应该将接口作为 const 传递吗?

    我最近 又 遇到了将接口传递为时的 Delphi 编译器代码生成错误const https stackoverflow com a 7640979 12597泄漏参考 如果您的方法被声明为传递接口变量 则会发生这种情况const e g p
  • 链接的属性 target="_newtab"

    什么是 newtab 中的目标属性值HTML a 标签 我找不到有关浏览器兼容性的信息 它适用于所有现代浏览器吗 如果在浏览器选项中用户设置为在新窗口而不是在新选项卡中打开链接 它将如何工作 这个值是否在任何地方描述过HTML标准 你确定
  • 使用 pyplot.imshow 时禁用 MatPlotLib 警告

    第一次来这里 当我使用时 我收到以下警告pyplot imshow功能 使用 RGB 数据将输入数据裁剪到 imshow 的有效范围 浮点数为 0 1 整数为 0 255 根据我的数据 我知道这是完全预期的行为 如何关闭此警告 我努力了 i
  • 在字符串列表中搜索字符串的有效方法?

    我有一个字符串列表 需要查找哪些字符串与给定的输入值匹配 对我来说 存储此字符串列表并能够搜索它的最有效方法 内存与执行速度 是什么 字符串列表的启动和加载并不重要 但搜索的响应时间很重要 我应该使用 List 或 HashSet 还是只是
  • 使用 python 启动通过 chcp 65001 预先激活的控制台窗口

    我使用 python 库将 Unicode 字符打印到 Windows 控制台 如果我调用库中打印出 Unicode 字符的函数 它将引发异常 charmap codec can t encode characters 这就是我试图解决该错
  • ModuleNotFoundError:没有名为“flask”的模块

    阅读完这篇文章的标题后 不要尝试先复制 因为这里的内容可能会以不同的方式被问到 顺便说一句 我对 python 很陌生 现在为了工作需要开始学习 这是我的依赖项 virtualenv version gt 15 0 2 pip versio
  • “Message”:“此请求的授权已被拒绝。” OWIN中间件

    我将基于令牌的身份验证添加到我的 OWIN 中间件中 并且可以生成令牌 但在使用具有授权属性的 API 调用的令牌时 我总是收到 此请求的授权已被拒绝 尽管没有 Authorize 属性 但它工作正常 这是我的startup cs 和控制器
  • iOS,通过代码锁定设备

    出于测试目的 制作本地通知的屏幕截图 我需要能够从代码 测试代码或应用程序代码 锁定设备 模拟器 我从这里查看了几个答案 GSEventLockDevice 但它们很旧并且不适合我 XCUIDevice 中有一个私有方法 因此您可以使用它锁
  • Three.js - 如何检查对象是否位于球体后面(不可见)

    我有一个球体 球体 表面有对象 引脚 并且带有 DOM 元素 标签 这些元素是从引脚位置到 2d 世界计算得出的 我的问题是 当图钉位于地球后面 通过鼠标拖动或动画 时 我需要隐藏 DOM 中的标签 以便在没有图钉的情况下文本标签不可见 我
  • Android 相机预览在切换相机时冻结?

    我正在为我的应用程序编写一个自定义相机 使用后置或前置摄像头打开活动时 它工作正常 但我真的很难在活动中切换摄像机 当我点击切换相机按钮时 预览冻结但什么也没发生 我已经尝试了与相机和预览相关的其他问题中建议的答案和提示 但没有任何效果 这
  • 如何覆盖jquery/javascript设置的css高度?

    我有这个 var setHeight this outerHeight returns e g 687 someElement css height setHeight px important I want to override thi
  • 使用 g++ 编译多线程代码(-Wl,--no-as-needed 不起作用)

    我的问题实际上是在这里描述的 使用g 编译多线程代码 https stackoverflow com questions 19463602 compiling multithread code with g 但是关于使用 Wl no as
  • 检查进程是否已加载

    有没有办法检查应用程序是否已完成加载 例如 如果我要使用Process newProcess Process Start C someFile xls 有没有IsLoaded or IsFinishedLoading或类似的东西 以便在应用
  • Python sys.argv 超出范围,不明白为什么

    我有一个脚本 我已经使用了一段时间来轻松地将文件上传到我的服务器 它已经工作了很长一段时间 但我无法让它在我的新台式计算机上工作 代码很简单 import os path import sys import os from ftplib i
  • 找到链表中循环的起始节点?

    如何在给定的链表中找到循环的起始节点 我们称其为循环点 到目前为止 我已经了解以下内容 使用慢 快指针 假设列表有一个非循环部分的大小k 缓慢移动 k 步 快速移动 2k 步 快的是 2k k k steps ahead of slow 慢