剑指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;
};
相关推荐
Chloeis Syntax5 小时前
栈和队列笔记2025-10-12
java·数据结构·笔记·
404未精通的狗5 小时前
(数据结构)线性表(下):链表分类及双向链表的实现
数据结构·链表
晨非辰7 小时前
【面试高频数据结构(四)】--《从单链到双链的进阶,读懂“双向奔赴”的算法之美与效率权衡》
java·数据结构·c++·人工智能·算法·机器学习·面试
im_AMBER7 小时前
数据结构 03 栈和队列
数据结构·学习·算法
卿言卿语9 小时前
CC1-二叉树的最小深度
java·数据结构·算法·leetcode·职场和发展
仰泳的熊猫9 小时前
LeetCode:889. 根据前序和后序遍历构造二叉树
数据结构·c++·算法
Emilia486.10 小时前
【Leetcode&nowcode&数据结构】单链表的应用(初阶)
c语言·数据结构·算法·leetcode
仰泳的熊猫10 小时前
LeetCode:700. 二叉搜索树中的搜索
数据结构·c++·算法·leetcode
杰 .11 小时前
C++ Hash
数据结构·c++·哈希算法
韧竹、12 小时前
数据结构之单链表
数据结构·链表