识别链表中循环的方法背后的逻辑

时间:2011-11-23 07:30:48

标签: algorithm linked-list floyd-cycle-finding

在检测链表中的循环的最佳方法中,我们执行以下操作:

  1. 使用Floyd的循环查找算法,并在链表中识别循环内的位置。
  2. 计算链表中的周期大小
  3. 将一个指针放在列表的开头,另一个'k'(其中k是周期的大小)位置。
  4. 在迭代时,他们在周期开始时会面。
  5. 我想知道为什么会这样。这背后有一些理论逻辑吗?

1 个答案:

答案 0 :(得分:2)

Floyd方法可以帮助您检测到有一个循环,但是因为在循环开始之前可能存在一些节点,所以它不能直接给出循环的长度。所以你应该在下一步计算长度。 现在我们想要发现循环的起点。考虑一下,周期长度是K,从头节点到周期开始的节点数是L,现在如果你向前移动两个指针,它们会在周期开始时相遇,因为,头指针必须前进L个节点,K前进的指针有两种可能性。它肯定会在L节点之后的循环开始,因为:选择1:如果它处于循环中,它位于循环K-L的节点K-(K-L) = L上。选择2:如果它不在周期内,L-K节点将保留在开始位置L-K + K = L