[数据结构] 如何判断一个链表是否有环?

准备研究生复试的时候, 遇到这个问题, 感觉挺有意思的, 所以记录下来.

在网上参考了这个答案:
https://blog.csdn.net/thefutureisour/article/details/8174313

但是后来又自己想了一下, 用自己的思维思考了一遍, 感觉更加清晰明了.

问题是:

  1. 如何判断一个链表是否有环?
  2. 环的长度如何计算?
  3. 如何找到环的入口?

我们先看图说话:

假设链表长度为7, 我们用 L 表示, 设有两个指针, P1和P2, 速度分别为1, 2, (P1 一次走1个结点, P1 一次走2个结点), 同时从 Node1出发.
那么请问: 何时P2再次赶上P1呢? 这是一个很有意思的问题. 就像以前的运动会长跑跑圈一样, 快的总会追上慢的.

我们要明白一个道理:
无论 P1 转了几圈, P2 第一次追上 P1 的时候, P2 一定比 P1 多走一圈而已!!

我们设 时间为 X 时, P2追上P1, 有表达式:
P1走的距离 + 一圈的长度 = P2走的距离
即为:
X1 + L = X2
化简为:
X = L
L = 7, 所以, P1和P2从 Node1出发后又一次且是第一次在 Node1相遇, 因为刚好走了一圈, 一圈长度为7.

我们再来看一个复杂的情况:
假设链表不是整个环, 而是从中间某一点开始有环的. 那么好像一下复杂了不少, 一下子有点绕不过弯了呢! 我是这样子的, 所以我想了好一会.
我们先来看图.

猜你喜欢

转载自www.cnblogs.com/notfresh/p/10419810.html