234. Palindrome Linked List

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

Example 1:

Input: 1->2
Output: false

Example 2:

Input: 1->2->2->1
Output: true

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

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        if(head == null) return true;
        ListNode slow = findmiddle(head);
        ListNode subhead = slow.next;
        slow.next = null;
        subhead = reverse(subhead);
        while(head != null && subhead != null && head.val == subhead.val){
            head = head.next;
            subhead = subhead.next;
        }
        if(subhead == null) return true;
        return false;
    }
    private static ListNode findmiddle(ListNode head){
        ListNode fast = head;
        ListNode slow = head;
        while(fast != null && fast.next != null && fast.next.next != null){
            fast = fast.next.next;
            slow = slow.next;
        }
        return slow;
    }
    private static ListNode reverse(ListNode head) {
        ListNode prev = null;
        while (head != null) {
            ListNode tmp = head.next;
            head.next = prev;
            prev = head;
            head = tmp;
        }

        return prev;
    }
}

findmiddle返回slow指针,指的是前半段最后一个node的位置,随后断开。后半段reverse,再把两段作比较,后半段长度只会小于等于前半段,所以后半段比较完就说明是palindrome。

原文地址:https://www.cnblogs.com/wentiliangkaihua/p/11392187.html