在单个链表中检测周期是一个众所周知的问题。我知道这个问题在互联网上已经被问及数十亿次了。我之所以再问这个问题,是因为我想到了一个我在其他地方没有遇到的解决方案。 (我承认我还没有深入搜寻)。在单向链表中检测周期
我的解决办法是:
给定一个链表指针一些节点,打破节点之间的链路和节点 - >下(); 然后从node-> next()开始并遍历,直到你到达一个结束点(这意味着没有循环)或者直到到达节点,这意味着有一个循环。
上面的解决方案有什么不对吗?
注:不要加入链接回一旦你完成。
在单个链表中检测周期是一个众所周知的问题。我知道这个问题在互联网上已经被问及数十亿次了。我之所以再问这个问题,是因为我想到了一个我在其他地方没有遇到的解决方案。 (我承认我还没有深入搜寻)。在单向链表中检测周期
我的解决办法是:
给定一个链表指针一些节点,打破节点之间的链路和节点 - >下(); 然后从node-> next()开始并遍历,直到你到达一个结束点(这意味着没有循环)或者直到到达节点,这意味着有一个循环。
上面的解决方案有什么不对吗?
注:不要加入链接回一旦你完成。
,将工作,检测完整周期(即周期,其周期的整个列表的),例如:
A -> B -> C -> D -> A
但是,如果我们在列表中的循环别的地方?
例如,
A -> B -> C -> D -> E -> C
我看不到你的算法将检测周期在这种情况下。
请记住,要检测第一种情况,我们甚至不需要中断链接。我们可以遍历该列表并继续比较每个节点的next
链接和head元素,以查看我们是否在开始时重新开始(或者结束)。
我想最简单的方法(不一定是最好的,但每个人都应该知道如何用Java在几行代码中实现的方法)是构建一个节点的哈希集,开始添加它们直到找到一个你已经看过。虽然需要额外的记忆。
如果你可以标记节点,标志着开始,直到你找到一个你之前标记(散列图基本上是一个外部标记)。
并检查常用图形理论书籍...
你不允许断开了链接,即使你加入回底。如果其他程序同时读取列表,该怎么办?
该算法在处理时不得损坏列表。
大多数解决方案都表明,两种不同速度的“跑步者”是最好的解决方案。会发生O(n),我的解决方案O(n)也是? –
我没有看到任何破坏链接的理由,只是将节点当作哨兵。一个问题:如果节点是a,那么你的算法就不能在a-> b-> c-> d-> e-> c上工作。你的算法只会检测最后一个节点指向第一个节点的循环。 –
如果循环不是全局的,则这不起作用。例如:'a - > b - > c - > b - > c - > b - > c - > b - > ...'永远不会返回到a。 –