假设您在 Java 中有一个链表结构。它由节点组成:
class Node {
Node next;
// some user data
}
每个 Node 都指向下一个节点,除了最后一个 Node,它的 next 为 null。假设列表有可能包含一个循环 - 即最终节点,而不是空值,具有对列表中在它之前的节点之一的引用。
最好的写作方式是什么
boolean hasLoop(Node first)
如果给定的节点是带有循环的列表的第一个,它将返回 true
,否则返回 false
?你怎么能写出来,让它占用恒定的空间和合理的时间?
这是带有循环的列表的图片:
原文由 jjujuma 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以利用 Floyd 的寻环算法,也称为 _龟兔算法_。
这个想法是有两个对列表的引用并以 不同的速度 移动它们。将一个向前移动
1
节点,另一个向前移动2
节点。next
)将变为null
。实现算法的Java函数: