234. 回文链表 (JAVA)

请判断一个链表是否为回文链表。

示例 1:

输入: 1->2
输出: false
示例 2:

输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

思路:改变前半部分或者后半部分List的next指针。由于改变前半部分只需要一次遍历(用快、慢指针就能实现在第一次遍历的时候把前半部分的next指针反转)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        ListNode fast = head, slow = head, pre = null, tmp;
        while(fast.next!=null) {
            fast = fast.next.next;
            tmp = slow.next;
            slow.next = pre;
            pre = slow;
            slow = tmp;
            if(fast == null){ //双数
                return check(pre, slow);
            }
        }

        //单数
        return check(pre, slow.next);
    }

    private boolean check(ListNode l1, ListNode l2){
        if(l1 == null) return true;
        if(l1.val != l2.val) return false;
        return check(l1.next, l2.next);
    }
}
原文地址:https://www.cnblogs.com/qionglouyuyu/p/14639030.html