计算链表中可能为循环的节点数

时间:2009-09-18 00:17:08

标签: algorithm linked-list

问题出在这里,它来自Sedgwick的优秀Java算法(q 3.54)

给定链接到单个链接列表中不包含空链接的节点(即每个节点链接到自身或列表中的另一个节点)确定不同节点的数量而不修改任何节点并且不再使用而不是恒定的记忆空间。

你是怎么做到的?扫描列表一次使用野兔和乌龟算法来确定它是否是任何方式的圆形,然后再次扫描以确定列表变为圆形的位置,然后再次扫描计算到这个位置的节点数?对我来说听起来有点蛮力,我想还有更优雅的解决方案。

4 个答案:

答案 0 :(得分:7)

tortoise and hare algorithm可以给你两个周期长度和周期开始前的节点数(分别为λ和μ)。

答案 1 :(得分:2)

最优雅的解决方案是Floyd的循环寻找算法:http://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_hare

它在O(N)时间内运行,只需要恒定的内存量。

答案 2 :(得分:1)

看看这个:Puzzle: Loop in a Linked List

  

指针标记:在实践中,链接   列表是使用C结构实现的   至少有一个指针;这样的结构   在C中应为4字节对齐。所以   最低有效两位是零。   在遍历列表时,您可以   '标记'遍历的指针   翻转最不重要的一点。一个   第二次遍历是为了清除这些   位。

答案 3 :(得分:-4)

回想起你去过哪里,如果你来到同一个节点就结束了。

尝试在二叉树中存储条目,你有O(N * log(N))时间和O(N)空间复杂性

修改

如果您不存储除exponetial order链接之外的所有内容,则可以使用Log(N)空间复制。这意味着你存储了第1,第2,第4,第8,第16,然后如果你被击中,你必须从那一点继续。这个时间的复杂度是N * Log(n)^ 2