下面是我查找链表中间位置的代码:
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循环内的代码及其条件
的工作方式。