「每日LeetCode」2021年8月6日

本文最后更新于:2023年3月19日 晚上

剑指 Offer II 027. 回文链表

剑指 Offer II 027. 回文链表

给定一个链表的 头节点  **head ,**请判断其是否为回文链表。
如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。

示例 1:

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

示例 2:

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

提示:

  • 链表 L 的长度范围为 [1, 105]
  • 0 <= node.val <= 9

思路

快慢指针找到中点,翻转中点之后的链表,从头结点和翻转后的头结点再开始比较每个是否相同即可。

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var isPalindrome = function (head) {
let slow = head,
fast = head;
while (fast && fast.next) {
slow = slow.next;
fast = fast.next.next;
}
let prev = null,
temp = null;
while (slow) {
temp = slow.next;
slow.next = prev;
prev = slow;
slow = temp;
}
while (prev) {
if (head.val !== prev.val) return false;
head = head.next;
prev = prev.next;
}
return true;
};