查找大小未知的循环链表的最后一个节点,最后一个节点指向链表的第一个节点以外的任何其他节点

时间:2009-07-11 20:30:02

标签: c list linked-list

如何查找圆形链表的最后一个节点,其大小我不知道,最后一个节点指向链表的第一个节点以外的任何其他节点?

6 个答案:

答案 0 :(得分:4)

可用于此的一种算法是Floyd cycle algorithm.

另请参阅this question.

答案 1 :(得分:3)

根据定义,如果节点未指向循环链表的第一个节点,则为 它不是最后一个节点。

你能在这里详细说明吗?

答案 2 :(得分:2)

一个奇怪的清单......为什么你会需要这样的东西?但无论如何......

您可以简单地遍历所有节点,并在下一个节点成为您已访问过的节点时立即停止。然后,当前节点就是您的答案。

您需要一些方法来跟踪已访问的节点。为每个节点添加一个布尔标志,或者使用某种具有快速插入和查找的设置数据类型(例如哈希集)。

答案 3 :(得分:0)

也许可以在列表的节点中添加参数,告诉您是否结束了?我想,这不会有问题。

否则,您可以记住已经访问过的节点。当已访问下一个节点时,您就在最后。

答案 4 :(得分:0)

Floyd循环算法不会给出列表的最后一个元素。它只会告诉你是否有一个循环。

最后一个的定义是,在从第一个开始的顺序扫描中遍历列表时,之前的所有元素和最后一个元素之前都没有被看到(指针值)。最后一个将是在此顺序扫描中已经看到的第一个元素。

一个简单的解决方案是标记访问过的元素,以便轻松检测到已经看到过的元素。该标志可以是侵入性的,即通过改变元素中的位,或者通过使用散列表来存储指针值。

由于我们需要能够测试元素是否已被访问过,所以我没有看到另一种解决方案。

答案 5 :(得分:0)

我可以详细说明如何使用Floyd的算法来解决这个问题,但我不明白一步的解释

  1. 有2个指针遍历链表,指针1以每个迭代1个节点的速率运行,第二个指针以2个节点的速率运行
  2. 当指针相遇时,我们处于循环中,并且在指针1到达循环结束之前我们已经有一段距离了(我们知道指针1尚未到达然后结束,因为如果循环是距离d并且指针2正在运行在速度为1的两倍时,指针1将循环两次循环,然后指针1执行一次)
  3. 因为他们在指针1完全遍历循环之前已经遇到过,我们知道会合点是从开始的d个节点和循环内的k个节点(pos = d + k)
  4. 如果我们将指针1设置到位置0并再次启动两个点(但是每次迭代的速率相同,则它们将在循环开始时相遇)。
  5. 因为我们知道循环的开始,所以找到结束是微不足道的
  6. 我不完全理解为什么第4步是真的,但我有一位朋友向我解释解决方案。