LC234 回文链表

98 阅读1分钟

给你一个单链表的头节点 head ,请你判断该链表是否为

回文链表

。如果是,返回 true ;否则,返回 false

 

示例 1:

输入: head = [1,2,2,1]
输出: true

示例 2:

输入: head = [1,2]
输出: false
解题思路

快慢指针

public boolean isPalindrome(ListNode head) { // 如果链表为空或只有一个节点,则是回文 if (head == null || head.next == null) { return true; }

// 初始化快慢指针
ListNode slow = head, fast = head;
ListNode pre = head, prepre = null;

// 使用快慢指针找到链表的中点,同时反转前半部分链表
while (fast != null && fast.next != null) {
    pre = slow;            // 保存当前的慢指针节点
    slow = slow.next;      // 慢指针移动一步
    fast = fast.next.next; // 快指针移动两步
    pre.next = prepre;     // 反转当前节点的next指向
    prepre = pre;          // 更新prepre为当前节点
}

// 如果链表长度为奇数,跳过中间节点
if (fast != null) {
    slow = slow.next;
}

// 比较反转的前半部分链表和后半部分链表
while (pre != null && slow != null) {
    if (pre.val != slow.val) { // 如果节点值不相同,则不是回文
        return false;
    }
    pre = pre.next;            // 前半部分链表向后移动
    slow = slow.next;          // 后半部分链表向后移动
}

return true; // 所有节点值都相同,则是回文

}