下面是检测链表是否包含循环的代码:

  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/

10-11 15:53