虽然是简单题,但快慢指针的解法挺有意思的。
解题分三个部分,一是用快慢指针找到回文的临界节点。
慢指针每次跑一个,快指针每次跑两个节点,不管链表长度是奇数还是偶数,我们都能得到以慢指针开头的回文后半部分。(在判断条件是while(fast && fast.next)的情况下)
第二部分是反转链表,比较基础;
第三部分,把两个比较两串链表的头结点值,不相等直接返回false,相等则分别都往下移动一个节点,直到比较完都相等则返回true。
const isPalindrome = (head) => {
let fast = head;
let slow = head;
let prev = new ListNode();
// 快慢指针移动 可以画图看 比如说 1 2 3 3 2 1
// 最后 prev 在 第一个3;slow在第二个3; fast在null
while(fast && fast.next){
prev = slow;
slow = slow.next;
fast = fast.next.next;
}
// 反转后半部分链表 注意要把prev和slow之间断开
prev.next = null;
// head2 是一个虚拟头结点
let head2 = null;
while(slow){
const next = slow.next;
slow.next = head2;
head2 = slow;
slow = next;
}
// 比较反转后的链表
while(head && head2){
if(head.val !== head2.val){
return false;
}
head = head.next;
head2 = head2.next;
}
return true;
};