剑指Offer|LCR 027.回文链表

LCR 027.回文链表

给定一个链表的 头节点 head **,**请判断其是否为回文链表。

如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。

示例 1:

复制代码
输入: head = [1,2,3,3,2,1]
输出: true

示例 2:

复制代码
输入: head = [1,2]
输出: false

提示:

  • 链表 L 的长度范围为 [1, 105]
  • 0 <= node.val <= 9

法1:数组

分析:

如果只有一个结点,直接返回true。

其他情况,遍历结点,将值存入数组,然后判断是否是回文。

时间复杂度 : O ( n ) O(n) O(n)

空间复杂度 : O ( n ) O(n) O(n)

js 复制代码
var isPalindrome = function(head) {
    if(head !== null && head.next === null) return true;
    let arr = [];
    let cur = head;
    while(cur !== null){
        arr.push(cur.val);
        cur = cur.next;
    }

    let left = 0;
    let right = arr.length - 1;
    while(left < right){
        if(arr[left] !== arr[right]){
            return false;
        } 
        left++;
        right--;
    }
    return true;
};

法2:快慢指针

分析:

看例子 head = [1,2,3,3,2,1]

时间复杂度 : O ( n ) O(n) O(n)

空间复杂度 : O ( 1 ) O(1) O(1)

js 复制代码
var isPalindrome = function(head) {
    // 如果链表为空或只有一个节点,是回文
    if (!head || !head.next) return 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 left = head;
    let right = prev;  // prev 是反转后的链表头
    while (right) {  // 只需遍历后半部分
        if (left.val !== right.val) {
            return false;
        }
        left = left.next;
        right = right.next;
    }

    return true;
};
相关推荐
im_AMBER3 分钟前
数据结构 11 图
数据结构·笔记·学习·图论
xiaoye-duck1 小时前
数据结构之二叉树-链式结构(上)
数据结构
Doro再努力1 小时前
2025_11_14洛谷【入门1】数据结构刷题小结
前端·数据结构·算法
cs麦子2 小时前
C语言--详解--指针--下
c语言·数据结构·算法
flashlight_hi2 小时前
LeetCode 分类刷题:3217. 从链表中移除在数组中存在的节点
javascript·数据结构·leetcode·链表
oioihoii3 小时前
C++中有双向映射数据结构吗?Key和Value能否双向查找?
数据结构·c++·算法
小欣加油3 小时前
leetcode 2536 子矩阵元素加1
数据结构·c++·算法·leetcode·矩阵
hnjzsyjyj3 小时前
AcWing 3595:二叉排序树 ← BST
数据结构·bst·二叉排序树
阿林学习计算机4 小时前
哈希表实现unordered_map
数据结构·哈希算法·散列表
洛_尘4 小时前
数据结构--6:优先级队列(堆)
java·数据结构