回文链表

时间:2018-06-08 22:47:49

标签: java reverse singly-linked-list palindrome

鉴于单链表,我想确定它是否是回文。对于我的方法,我选择反转链表的前半部分,然后比较链表的两半是否具有相同的元素。以前,我将行fast = fast.next.next放在第一个while循环的末尾(在其他4个行的下面)。但是,当我这样做时,我收到了一个N​​ull 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;
    }
}

1 个答案:

答案 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将抛出空引用异常。

希望这会有所帮助。