使用快速/慢速ptrs查找链表的中间,当我不应该(fast.next.)时遇到nullptr错误.下一个检查)



下面是我查找链表中间位置的代码:

public ListNode findMiddleNode(ListNode head) {
if(head == null){return null;}
if(head.next == null){return head;}
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next.next != null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}

在1->2->3->4->5的情况下,它的最终迭代应该是:

1->2->3->4->5
s
f

我的循环应该在这里结束。Fast.next.next为空,不存在。然而,我得到一个控制台nullptr错误,而不是答案'3'。我猜我是在列表之外。

有人能猜出为什么会发生这种情况吗?

编辑:看起来如果我添加条件"fast.next"在我的while循环中,它是有效的。不知道为什么。

编辑2:是"fast.next.next",当fast是在我的列表的末尾在5,给我一些垃圾值,不是空的?只是猜测。

编辑3:这是我的完整结果输出:https://ibb.co/XpNbFWh,在firecode.io

while(fast != null && fast.next.next != null){

上面一行代码检查fast.next.next而不检查fast.next

由于fast.next可以为空,在这种情况下,fast.next.next可以抛出NullPointerException

while内的代码和条件有逻辑错误。试试这个,我在纸上试过了,它似乎工作得很好:

while(fast != null && fast.next != null){
slow = slow.next;
if (fast.next != null)
{
fast = fast.next;
if (fast.next!=null)
fast = fast.next;
}
}
我想代码可以简化,但是,正如另一个用户所说,你的错误在fast.next.next这行.出于这个原因,我在while中添加了条件fast。= null以避免NullPointerException。您应该在纸上验证while循环内的代码及其条件 的工作方式。

相关内容

  • 没有找到相关文章

最新更新