[数据结构] 如何判断一个链表是否有环? 环的入口? 环的长度?
练习算法的时候, 遇到这个问题, 感觉挺有意思的, 所以记录下来.
在网上参考了这个答案:
https://www.geek-share.com/detail/2563707448.html
但是后来又自己想了一下, 用自己的思维思考了一遍, 感觉更加清晰明了.
问题是:
- 如何判断一个链表是否有环?
- 环的长度如何计算?
- 如何找到环的入口?
我们先看图说话:
假设链表长度为7, 我们用 L 表示, 设有两个指针, P1和P2, 速度分别为1, 2, (P1 一次走1个结点, P1 一次走2个结点), 同时从 Node1出发.
那么请问: 何时P2再次赶上P1呢? 这是一个很有意思的问题. 就像以前的运动会长跑跑圈一样, 快的总会追上慢的.
我们要明白一个道理:
无论 P1 转了几圈, P2 第一次追上 P1 的时候, P2 一定比 P1 多走一圈而已!!
我们设 时间为 X 时, P2追上P1, 有表达式:
P1走的距离 + 一圈的长度 = P2走的距离
即为:
X * 1 + L = X * 2
化简为:
X = L
L = 7, 所以, P1和P2从 Node1出发后又一次且是第一次在 Node1相遇, 因为刚好走了一圈, 一圈长度为7.
我们再来看一个复杂的情况:
假设链表不是整个环, 而是从中间某一点开始有环的. 那么好像一下复杂了不少, 一下子有点绕不过弯了呢! 我是这样子的, 所以我想了好一会.
我们先来看图.
但是道理还是一样的.
无论环的入口在哪里,
无论 P1 和P2 在环里转了几圈, P2 第一次追上 P1 的时候, P2 一定比 P1 多走一圈环的长度而已!!
我们设 时间为 X 时, P2追上P1, 有表达式:
P1走的距离 + 此时环一圈的长度(记为C) = P2走的距离
即为:
X * 1 + C = X * 2
化简为:
X = C
在这张图中, 我们知道 C=5, P1和P2在 Node6处相遇, 因为是从 Node1出发的, P1走了5个时间单位, 速度为1.
更加一般的情况是, C = (V2-V1)* X, V2代表P2的速度, V1代表P1的速度, 我们为了方便表示, 简单令其为2 和 1 罢了.
既然我们知道了C的长度, 那么如何求 环的入口呢?
有两种办法:
- 用链表的长度 L 减去C, 即可得到从出发点走几步,就到了 环的入口. 比如这里, 7-5=2, 走两步, 环的入口是Node3.
- 如果我们没有求出C的长度怎么玩呢?
我们知道, 环的入口, 其实也是链表的尾结点, 和Node1的距离, 是L-C, 因为环的长度为C, 链表总长度为L, 而这段不在环内.
同时, 我们记相遇点为 NodeX, NodeX到 环的入口, 也就是尾结点的距离, 为 L-C. ? 如何理解, 下面是证明步骤:
因为P1从Node1出发走了X个时间长度单位到NodeX, 而剩下的长度为L-X, 而C=X.
所以, 所以NodeX到环的入口的距离为 L-C,
如果此时 再让 另一个指针P3 以和P1相同的速度出发往前走, 那么, P1和P3必然在环的入口相遇.
转载于:https://www.cnblogs.com/notfresh/p/ringInLinklist.html
- 点赞
- 收藏
- 分享
- 文章举报
- 链表面试题----判断一个单链表是否带环,若带环,求入口点和环的长度
- 如何判断一个链表是否有环,如何确定入口
- 如何判断一个链表是否有环,如果有环,并找出环的入口
- 如何判断一个链表是否有环? 2、如果链表为存在环,如果找到环的入口点?
- 首先如何判断一个链表是否有环,并找出环的入口
- day03之判断链表带环以及求环的长度及环的入口点+一个类不能被继承及只能分别在栈堆上创建对象
- 【郝斌数据结构自学笔记】25_判断链表是否为空和求链表长度算法的演示
- 如何判断单链表是否有环、环的入口、环的长度和总长
- 【面试】3.如何判断链表是否有环?如何计算环的长度?
- 判断一个单链表是否有环,如果有环求出环的入口点和环的长度
- 如何判断一个链表中是否有环(百度面试题)
- 数据结构之链表面试题汇总(三)判断单链表是否有环、取出环的起始点、得到有环链表中环的长度
- 判断链表是否有环,环的入口以及环的长度
- 数据结构和算法设计专题之---判断单链表中是否有环,环的长度,环的入口节点
- 如何判断一个单向链表是否有环路
- 如何判断链表是否有环?如何计算环的长度?
- -判断链表是否带环?若带环求环的长度?若带环求环的入口点
- 判断链表是否有环并求环的入口和环的长度
- [算法练习FindLoop]判断单向链表是否存在循环/循环入口/环长度
- 【算法之链表(一)】判断单链表中是否有环、环的长度、环的入口节点,单链表的倒数第K个节点等