📌  相关文章
📜  检查单链表是否为回文的 Javascript 程序(1)

📅  最后修改于: 2023-12-03 15:10:52.297000             🧑  作者: Mango

检查单链表是否为回文的 JavaScript 程序

当我们要判断一个单链表是否为回文(即正反读起来一样),有一种比较直观的做法是使用快慢指针找到链表的中点,然后将链表的后半部分翻转,最后再对比前半部分和反转后的后半部分是否相等。

下面给出一份使用 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 题目进行测试。