• 作者:老汪软件技巧
  • 发表时间:2024-09-16 15:02
  • 浏览量:

难度:简单

题目

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

示例 1:

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

示例 2:

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

提示:

解题思路:

要判断一个单链表是否为回文链表,我们可以采用以下步骤来实现:

找到中间节点:使用快慢指针法找到链表的中间节点。

反转后半部分:将链表的后半部分反转。

比较前后两部分:比较链表的前半部分和反转后的后半部分是否相同。

JavaScript实现:

/**
 * 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;
  let current = slow;
  while (current) {
    let next = current.next;
    current.next = prev;
    prev = current;
    current = next;
  }
  // 比较前半部分和反转后的后半部分
  let left = head;
  let right = prev;
  while (right) {
    if (left.val !== right.val) {
      return false;
    }
    left = left.next;
    right = right.next;
  }
  return true;
};
// 示例
// const createLinkedList = (values) => {
//   let dummyHead = new ListNode(0);
//   let current = dummyHead;
//   values.forEach(value => {
//     current.next = new ListNode(value);
//     current = current.next;
//   });
//   return dummyHead.next;
// };
// const list = createLinkedList([1, 2, 2, 1]);
// console.log(isPalindrome(list)); // 输出: true