当前位置: 首页 > 知识库问答 >
问题:

在链表中检测循环中的第一个节点

鲍永春
2023-03-14

最近,我已经完成了检测循环中第一个节点的算法,如下所述:-

注:本声明摘自以下网站:-

http://javabypatel.blogspot.in/2015/12/detect-loop-in-linked-list.html


步骤1:找到循环后,两个指针都指向在循环内的交汇点的公共节点,
步骤2:现在,在它们之间移动一个指针(比如乌龟)到列表的头部,保持野兔指针在循环内的交汇点的相同位置。
步骤3:开始一次移动两个指针一个节点。它们都将相遇的地方是循环/循环的开始节点。

让我们在下面的图像中考虑案例2:

http://4.bp.blogspot.com/-79s5PBIexDE/Vmac8UlposI/AAAAAAAAAvQ/ejHRpGv_OLY/s1600/loop-in-linked-list-example.png

在应用所有步骤的过程中,在案例2中,我在步骤3中被塞住了

"下面是针对案例2的兔子和乌龟算法的计算结果。"

更快-1更慢-1
更快-5更慢-20
更快-22更慢-5
更快-20更慢-18
更快-18更慢-22
更快-1更慢-1-两个指针在这里相遇

因此,根据步骤2,我保持快速指针不变,并将慢速指针移动到1(这是列表的头部)。

因此,按照步骤3,我将逐个递增每个指针。

因为,它们都在“1”中,将每个指针移动一次,将永远不会结束,它将继续移动。

问题1。请问我是否理解了第三步中的错误?

问题2。我可以假设循环结束的节点是循环中的第一个节点吗?

共有1个答案

和选
2023-03-14

在最后一步之前,您似乎已经正确地跟踪了给定的算法。但是,在最后一步,我认为您错误地将术语“列表头”视为指向列表第一个元素的指针。因此,您可能推断循环永远不会结束,因为两个指针将以相同的速度移动,并且一个指针将领先另一个指针1。然而,我相信列表的头是用来指列表中的第一个元素,而不是指向第一个元素的指针。

顺便说一句,我认为你的困惑不是源于你犯的错误,而是源于你在问题中提供的伪代码的模糊性。即使你没有误解列表的头部,你也会执行一次伪代码的步骤3,并得出结论,指针将在标签为20的节点处相遇。(即列表第一个节点之后的那个)所以,我认为步骤3可作如下澄清。

第三步:当兔子和乌龟在不同的单元格时,一次将两个指针移动一个节点。

如果遇到您提供的案例2这样的情况,在将其中一个指针移动到列表的开头后,迭代的条件将不会被满足,因为指针已经满足了。(列表的开头)

尽管您最初的第二季度非常不清楚,但让我根据您对其的澄清作为对我答案的评论来回答。

在您提供的链接中,显示了在您提供的伪代码的步骤1之后兔子和乌龟指针相遇的交点M与列表的第一个元素到循环起点的精确距离。(即上图中的距离p和r相等)因此,如果一个指针放在列表的开头,另一个指针保持在它们的汇合点,如果两者移动1,只要它们不在列表的同一节点,是的,您可以假设它们的汇合点就是列表中循环的开始,如果这样的循环曾经存在。

 类似资料:
  • 我需要实现一个循环的单链表数据结构。我无法理解的是何时何地必须声明列表的最后一个节点必须指向第一个节点。我有以下空构造函数来构建列表: 因此,基本上每个列表都以一个null对象开始,该对象再次指向null,表示列表结束: 然而,我不知道的是如何使它当列表包含至少一个节点时,该节点将指向列表的第一个节点。 例如,看看我为常规链表实现的addLast()方法: 我必须把它变成这样: 一旦列表的下一个节

  • 问题内容: 假设你在Java中拥有一个链表结构。它由节点组成: 每个节点都指向下一个节点,但最后一个节点除外,后者的下一个为空。假设列表有可能包含一个循环-即最终的Node而不是null,而是引用了列表中位于其之前的节点之一。 最好的写作方式是什么 如果给定的是带有循环的列表的第一个,则将返回什么,否则返回?你怎么写才能占用恒定的空间和合理的时间? 问题答案: 想法是要有两个引用列表,并以不同的速

  • 我有一个基本的链表问题,我在下面试图解决。如果您能为我的方法、算法的正确性(甚至是编码风格)提供任何信息,我将不胜感激。该问题需要一个函数,该函数删除循环链表中所有出现的int,并返回列表中的任何节点或NULL(当列表为NULL时)。 以下是我目前掌握的一些C代码:

  • 我理解得对吗?(从虚拟节点开始) dummy->a->b->c->d->dummy(环绕到dummy节点) 因此,如果我想删除第一个实际的数据段(A),我需要将它分配给一个临时变量。所以Node first=head.next。然后我需要有一个虚拟的头部引用“B”,所以我需要做head.next=first.next。这就是所有需要做的吗? 在从列表中删除任何节点N的情况下(假设它在列表中),这是

  • 以下代码删除双链接列表中的第一个节点。 如果列表只包含1个元素,我们将last的引用设置为null。我的问题是,我们为什么不将first的引用设置为null?这会有什么不同吗?

  • 给定一个单链表和中间节点从一开始的编号,我试图通过将最后一个节点指向中间节点来创建一个循环单链表。我写了以下代码: 然而,Linkedlist的最后一个节点仍然指向null而不是中间节点。我明白我哪里出错了,我找不到它。请帮忙。