LeetCode题解:Palindrome Linked List

Given a singly linked list, determine if it is a palindrome.

Follow up:
Could you do it in O(n) time and O(1) space?

题意:给定一个单向链表,判断是否为回文

解决思路:假设一个链表是回文,那么把链表分割为1…n/2,n/2+1…n两个部分,这两个部分肯定是相同的(把第二部分顺序逆转过来或者逆转第一部分)。所以如果我们能把任何一个部分的链表顺序逆转过来,就可以解决这个问题。

那么要怎么逆转过来呢?首先可以用快慢指针得到中间结点(一个指针一次向前移动一个结点,一个移动两个结点),而且在指针移动的同时逆转顺序。

public boolean isPalindrome(ListNode head) {
        if(head == null || head.next == null){
            return true;
        }

        ListNode pointerA = head;
        ListNode pointerB = head;
        ListNode pre = null;
        ListNode next = pointerA.next;

        while(pointerB.next != null && pointerB.next.next != null){
            pointerB = pointerB.next.next;

            pre = pointerA;
            pointerA = next;
            next = next.next;
            pointerA.next = pre;
        }

        if(pointerB.next == null){
            pointerA = pointerA.next;
        }

        while(next != null){
            if(next.val != pointerA.val){
                return false;
            }else{
                next = next.next;
                pointerA = pointerA.next;
            }
        }
        return true;
    }

你可能感兴趣的:(LeetCode)