📅  最后修改于: 2023-12-03 15:10:52.297000             🧑  作者: Mango
当我们要判断一个单链表是否为回文(即正反读起来一样),有一种比较直观的做法是使用快慢指针找到链表的中点,然后将链表的后半部分翻转,最后再对比前半部分和反转后的后半部分是否相等。
下面给出一份使用 JavaScript 实现的代码片段。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var isPalindrome = function(head) {
if (!head || !head.next) return true; // 链表为空或只有一个元素,直接返回 true
// 使用快慢指针找到链表的中点
let slow = head;
let fast = head;
while (fast && fast.next) {
slow = slow.next;
fast = fast.next.next;
}
// 翻转链表的后半部分
let prev = null;
while (slow) {
let next = slow.next;
slow.next = prev;
prev = slow;
slow = next;
}
// 对比前半部分和反转后的后半部分是否相等
let p1 = head;
let p2 = prev;
while (p1 && p2) {
if (p1.val !== p2.val) return false;
p1 = p1.next;
p2 = p2.next;
}
return true;
};
在以上代码中,我们首先判断了链表是否为空或只有一个元素,如果是,则直接返回 true。之后使用快慢指针找到链表的中点,然后翻转链表的后半部分,最后对比前半部分和反转后的后半部分是否相等。
需要注意的是,在翻转链表的后半部分过程中,我们需要一个额外的指针 prev 来记录当前节点的前一个节点,以便正确地将当前节点的 next 指向 prev。
另外,在对比两个部分是否相等的过程中,我们使用了两个指针 p1 和 p2,分别遍历前半部分和反转后的后半部分,如果发现两个节点的值不相等,则链表不是回文,直接返回 false。否则继续遍历,直到两部分全部遍历完,此时链表为回文,返回 true。
以上代码可以通过 LeetCode 的 234. Palindrome Linked List 题目进行测试。