检测单链表中的循环



检测单个链表中的循环是一个众所周知的问题。我知道这个问题在网上已经被问过无数次了。我之所以再问一遍,是因为我想到了一个在其他地方没有遇到的解决方案。(我承认我也没有深入研究过)。

我的解决方案是:

给定一个链表和指向某个节点的指针,断开节点与节点之间的链接->next();然后从node->next()开始并遍历,直到到达终点(这意味着没有循环),或者直到到达节点(这意味着有循环)。

以上解决方案有什么不对/好的地方吗?

注意:请在完成后加入链接。

将检测完整循环(即,周期为整个列表的循环),例如:

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

但是如果我们在列表的其他地方有一个循环呢?

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

在这种情况下,我看不出你的算法会检测到循环。

请记住,为了检测第一种情况,我们甚至不需要断开链接。我们可以遍历列表,并将每个节点的next链接与head元素进行比较,看看我们是否已经从开始处开始(或到达结束处)。

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

如果你可以标记节点,开始标记它们,直到你找到一个你之前标记的(哈希映射本质上是一个外部标记)。

查阅常用的图论书籍…

您不允许断开链接,即使您在最后重新连接它。如果其他程序同时读取该列表该怎么办?

算法在处理列表时不能损坏列表

相关内容

  • 没有找到相关文章

最新更新