给你一个单链表的头节点 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; // 所有节点值都相同,则是回文
}