下面是检测链表是否包含循环的代码:
public static boolean containsCycle(LinkedListNode firstNode) {
// start both runners at the beginning
LinkedListNode slowRunner = firstNode;
LinkedListNode fastRunner = firstNode;
// until we hit the end of the list
while (fastRunner != null && fastRunner.next != null) {
slowRunner = slowRunner.next;
fastRunner = fastRunner.next.next;
// case: fastRunner is about to "lap" slowRunner
if (fastRunner == slowRunner) {
return true;
}
}
// case: fastRunner hit the end of the list
return false;
while循环的条件不应该是fastRunner!= null && fastRunner.next.NEXT!= null吗?使用当前代码,fastRunner可以是链接列表中的最后一个节点,因此一旦进入while循环,最后一个节点的下一个节点将导致异常。
最佳答案
使用当前代码,fastRunner可以成为链接列表中的最后一个节点fastRunner
不能是链接列表中的最后一个节点,因为您的while
循环
while (fastRunner != null && fastRunner.next != null) {
检查
fastRunner
不是最后一个元素(因为fastRunner.next == null
表示fastRunner
是最后一个元素)。您的循环中有此作业fastRunner = fastRunner.next.next;
可以肯定地将
fastRunner
设置为null
,但是您没有对其进行任何操作都会导致空指针异常,并且while
循环的下一个迭代将退出(因为现在是fastRunner == null
)关于java - 链表循环潜在异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45767014/