likes
comments
collection
share

【算法】回文链表难度:简单 题目: 给你一个单链表的头节点 head ,请你判断该链表是否为 回文链表。如果是,返回 t

作者站长头像
站长
· 阅读数 37

难度:简单

题目:

给你一个单链表的头节点 head ,请你判断该链表是否为

回文链表。如果是,返回 true ;否则,返回 false

示例 1:

【算法】回文链表难度:简单 题目: 给你一个单链表的头节点 head ,请你判断该链表是否为 回文链表。如果是,返回 t

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

示例 2:

【算法】回文链表难度:简单 题目: 给你一个单链表的头节点 head ,请你判断该链表是否为 回文链表。如果是,返回 t

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

提示:

  • 链表中节点数目在范围[1, 105]
  • 0 <= Node.val <= 9

解题思路:

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

  1. 找到中间节点:使用快慢指针法找到链表的中间节点。
  2. 反转后半部分:将链表的后半部分反转。
  3. 比较前后两部分:比较链表的前半部分和反转后的后半部分是否相同。

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
转载自:https://juejin.cn/post/7421965445526454310
评论
请登录