面试题 02.06. 回文链表

161 阅读1分钟

题目描述

image.png

思路

  • 快慢指针找链表中点
  • 翻转后半部分(奇偶情况分析)
  • 后半部分和前半部分比较

1A887CEA3B32D8B478787E9647A6BF36.png

代码

class Solution {
    public boolean isPalindrome(ListNode head) {
        ListNode dummy = new ListNode();
        dummy.next = head;
        // 找中点
        ListNode fast = head, slow = head, pre = dummy;
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
            pre = pre.next;
        }
        // slow停在中点,pre是中点前一位
        pre.next = null; // 切断前半部分
        // 反转后半段
        pre = null;
        ListNode cur = slow;
        while (cur != null) {
            ListNode tmp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = tmp;
        }
        // pre是反转后的后半段的头
        ListNode newHead = pre;
        //开始同步比较
        while (head != null && newHead != null) {
            if (head.val != newHead.val) {
                return false;
            }
            head = head.next;
            newHead = newHead.next;
        }
        return true;
    }
}