鉴于单链表,我想确定它是否是回文。对于我的方法,我选择反转链表的前半部分,然后比较链表的两半是否具有相同的元素。以前,我将行fast = fast.next.next放在第一个while循环的末尾(在其他4个行的下面)。但是,当我这样做时,我收到了一个Null Pointer Exception。现在,当我将它转移到while循环中的第一行时,我没有错误,我的程序被接受了。有人可以向我解释为什么会这样吗?谢谢!以下是我的代码:
class Solution {
public boolean isPalindrome(ListNode head) {
if(head == null || head.next == null){
return true;
}
ListNode fast = head;
ListNode slow = head;
ListNode prev = null;
while(fast != null && fast.next != null){
fast = fast.next.next;
ListNode temp = slow.next;
slow.next = prev;
prev = slow;
slow = temp;
}
if(fast != null){
slow = slow.next;
}
while(prev != null && prev.val == slow.val){
prev = prev.next;
slow = slow.next;
}
return slow == null;
}
}
答案 0 :(得分:1)
这是因为如果您先致电slow.next = prev
,则会失去对first.next.next
的引用。这是为什么?
根据您的初始化:
fast -> head
slow -> head
prev -> null
现在,在您的while循环中,您正在检查fast.next
是否未指向null
。
因此,fast.next.next
有效。
但请注意,slow.next
指向与fast.next
相同的引用。为了便于解释,我们将说两者都指向一个名为SOMETHING的内存地址。
fast (HEAD) -> next -> SOMETHING
slow (HEAD) -> next -> SOMETHING
如果你把fast.next.next
放在while循环的顶部,那么它是有效的,因为它仍然指向某个东西。
如果你将fast.next.next放在while循环的底部,那么就行了
slow.next = prev
会先将head.next
设为null
。
您现在修改了head.next
以指向任何内容。
因为fast也指向头部,fast.next
现在也指向null。
fast (head) -> next -> NULL
因此调用fast.next.next将抛出空引用异常。
希望这会有所帮助。