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

Algorithm 识别链表中循环的方法背后的逻辑,algorithm,linked-list,floyd-cycle-finding,Algorithm,Linked List,Floyd Cycle Finding,在检测链表中循环的最佳方法中,我们执行以下操作: 使用Floyd的循环查找算法,在链表中确定循环中的位置 计算链接列表中循环的大小 将一个指针放在列表的开头,将另一个“k”(其中k是循环的大小)放在远处 在迭代中,它们在循环开始时相遇 我想知道为什么会这样。这背后的一些理论逻辑?Floyd方法可以帮助您检测到存在一个循环,但由于在循环开始之前可能存在一些节点,因此它不能直接给出循环的长度。因此,您应该在下一步中计算长度。 现在我们要找出周期的起点。考虑到,循环的长度是“代码>K</代码>”,从头

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

  • 使用Floyd的循环查找算法,在链表中确定循环中的位置
  • 计算链接列表中循环的大小
  • 将一个指针放在列表的开头,将另一个“k”(其中k是循环的大小)放在远处
  • 在迭代中,它们在循环开始时相遇

  • 我想知道为什么会这样。这背后的一些理论逻辑?

    Floyd方法可以帮助您检测到存在一个循环,但由于在循环开始之前可能存在一些节点,因此它不能直接给出循环的长度。因此,您应该在下一步中计算长度。
    现在我们要找出周期的起点。考虑到,循环的长度是“代码>K</代码>”,从头节点到循环开始的节点数是“代码>L</代码>”,现在如果将两个指针向前移动,它们在循环开始时相遇,因为头指针必须前进:代码> L>代码>节点,前面的代码<>代码> k>代码有两种可能性。它肯定会在
    L
    节点之后开始循环,因为:选项1:如果它在循环中,它在循环的
    K-L
    节点上,并且
    K-(K-L)=L
    。选择2:如果循环结束,
    L-K
    节点仍保留在开始处,并且
    L-K+K=L

    也许您在描述中混合了“循环”和“链表”?通常,“循环”指的是迭代的构造,而您似乎关心链表中的“循环”。只是想让你知道,是的。我是说自行车。谢谢你的澄清,这似乎有点明显——如果不清楚的话,也许可以画一个图表?我知道它是有效的。我只是不清楚它是如何到达的,
    K-(K-L)=L
    意味着什么?@Aks,当循环长度为
    K
    且您位于节点
    K-L
    上时,前面有
    L
    节点到达循环的开始(对于从链表头部开始的节点来说完全相同).您是如何得知节点位于cycle@Aks第3部分说指针距离
    K
    位置较远,所以如果我们假设从循环开始到循环开始有
    L
    节点,指针位于节点
    K-L
    L
    节点从
    K
    步数到达循环开始)