2011-11-26 115 views
1

在单个链表中检测周期是一个众所周知的问题。我知道这个问题在互联网上已经被问及数十亿次了。我之所以再问这个问题,是因为我想到了一个我在其他地方没有遇到的解决方案。 (我承认我还没有深入搜寻)。在单向链表中检测周期

我的解决办法是:

给定一个链表指针一些节点,打破节点之间的链路和节点 - >下(); 然后从node-> next()开始并遍历,直到你到达一个结束点(这意味着没有循环)或者直到到达节点,这意味着有一个循环。

上面的解决方案有什么不对吗?

注:不要加入链接回一旦你完成。

+0

大多数解决方案都表明,两种不同速度的“跑步者”是最好的解决方案。会发生O(n),我的解决方案O(n)也是? –

+0

我没有看到任何破坏链接的理由,只是将节点当作哨兵。一个问题:如果节点是a,那么你的算法就不能在a-> b-> c-> d-> e-> c上工作。你的算法只会检测最后一个节点指向第一个节点的循环。 –

+0

如果循环不是全局的,则这不起作用。例如:'a - > b - > c - > b - > c - > b - > c - > b - > ...'永远不会返回到a。 –

回答

2

,将工作,检测完整周期(即周期,其周期的整个列表的),例如:

A -> B -> C -> D -> A 

但是,如果我们在列表中的循环别的地方?

例如,

A -> B -> C -> D -> E -> C 

我看不到你的算法将检测周期在这种情况下。

请记住,要检测第一种情况,我们甚至不需要中断链接。我们可以遍历该列表并继续比较每个节点的next链接和head元素,以查看我们是否在开始时重新开始(或者结束)。

0

我想最简单的方法(不一定是最好的,但每个人都应该知道如何用Java在几行代码中实现的方法)是构建一个节点的哈希集,开始添加它们直到找到一个你已经看过。虽然需要额外的记忆。

如果你可以标记节点,标志着开始,直到你找到一个你之前标记(散列图基本上是一个外部标记)。

并检查常用图形理论书籍...

0

你不允许断开了链接,即使你加入回底。如果其他程序同时读取列表,该怎么办?

该算法在处理时不得损坏列表。