【问题标题】:Beginning of loop in doubly linked list?双向链表中循环的开始?
【发布时间】:2011-12-15 19:39:35
【问题描述】:

我遇到的一个问题, 在循环链表中,找到循环开头的节点?

示例输入:A -> B -> C -> D -> E -> C [与之前相同的 C] 输出:C

其中一种解决方案是,看看存储在这些节点上的值的地址是否相同?

所以像 &(A->value) 这样的东西会返回我们的地址,然后我们会发现一个地址是否重复,如果是,那就是循环的开始?

【问题讨论】:

  • 如果节点按值存储(即依赖于所包含类型的复制语义)则不起作用。还有其他方法可以解决这个问题...
  • 比较节点本身似乎更容易,即A而不是&(A->value)。 (虽然后者也可以。)
  • 您可以使用增量值来计算列表中的节点。遍历列表时,您可以检查值是递减(回到开头)还是递增。
  • 在使用链表的常见循环队列实现中,保留两个指针指向前节点和后节点。此技术可用于查找循环链表的开头和结尾(当且仅当以这种方式设计时)。

标签: c++ c linked-list


【解决方案1】:

您可以这样做,但就空间复杂性而言,这样做效率很低,因为您需要存储“沿途看到”的所有节点。

更好的解决方案可能是Floyd's cycle 查找算法,如this post 中所述

【讨论】:

  • 我们已经知道列表是循环的,所以这有点矫枉过正。
  • @Jon,有什么更好的选择?你的答案没有说。
  • @avakar:我可能误解了这个问题。
  • @Jon: 不是真的,这个算法非常简单而且开销很低,所以它不是一个真正的大锤。
  • @MatthieuM.:好吧,要么 q 谈论一个循环链表,我们希望在其中基于重复的节点值而不是链接找到“循环”,或者它谈论一个图(不是一个包含循环的列表)——令人困惑,所以我什至不知道我们这里是否有相同的心理模型。
猜你喜欢
  • 2021-07-05
  • 1970-01-01
  • 2013-11-15
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多