剑指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;
};
相关推荐
_OP_CHEN14 分钟前
C++进阶:(七)红黑树深度解析与 C++ 实现
开发语言·数据结构·c++·stl·红黑树·红黑树的旋转·红黑树的平衡调整
不穿格子的程序员1 小时前
从零开始写算法-栈-最小值(记忆化pair)
数据结构·
小龙报1 小时前
《算法通关指南数据结构和算法篇(4)--- 队列和queue》
c语言·开发语言·数据结构·c++·创业创新·学习方法·visual studio
AI科技星2 小时前
宇宙的几何诗篇:当空间本身成为运动的主角
数据结构·人工智能·经验分享·算法·计算机视觉
前端小L2 小时前
二分查找专题(二):lower_bound 的首秀——精解「搜索插入位置」
数据结构·算法
CAU界编程小白3 小时前
数据结构系列之十大排序算法
数据结构·c++·算法·排序算法
执携3 小时前
数据结构 -- 树(遍历)
数据结构
lkbhua莱克瓦244 小时前
Java基础——常用算法4
java·数据结构·笔记·算法·github·排序算法·快速排序
还是码字踏实5 小时前
基础数据结构之哈希表:两数之和(LeetCode 1 简单题)
数据结构·leetcode·散列表
Kt&Rs5 小时前
11.5 LeetCode 题目汇总与解题思路
数据结构·算法·leetcode