检测单个链表中的周期是众所周知的问题。我知道这个问题在互联网上已被问过无数次。我再次问它的原因是我想到了一个我在其他地方没有遇到过的解决方案。 (我承认我也没有深入搜索过)。
我的解决方案是:
给定链接列表和指向某个节点的指针,断开节点和node-> next()之间的链接; 然后从node-> next()开始并遍历,直到你到达终点(这意味着没有循环)或直到你到达节点,这意味着有一个循环。
上述解决方案有什么不妥之处吗?
注意:完成后请加入链接。
答案 0 :(得分:2)
这将检测完整周期(即整个列表周期的周期),例如:
A -> B -> C -> D -> A
但是如果我们在列表中的其他地方有一个循环呢?
例如,
A -> B -> C -> D -> E -> C
在这种情况下,我无法看到您的算法会检测到周期。
请记住,要检测第一种情况,我们甚至不需要破坏链接。我们可以遍历列表并继续将每个节点的next
链接与head元素进行比较,以查看我们是否在开始时(或结束时)重新开始。
答案 1 :(得分:0)
我想最简单的方法(不一定是最好的方法,但每个人都应该知道如何在几行代码中用Java实现)是构建节点的哈希集,开始添加它们直到找到一个你以前见过的。虽然占用了额外的内存。
如果您可以标记节点,请开始标记它们,直到找到之前标记的节点(哈希图本质上是外部标记)。
检查通常的图论理论书......
答案 2 :(得分:0)
即使您最后加入链接,也不允许断开链接。如果其他程序同时读取列表该怎么办?
算法在处理时不得损坏列表。