剑指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;
};
相关推荐
漂流瓶jz44 分钟前
UVA-1606 两亲性分子 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·向量·aoapc·算法竞赛入门经典·atan2·浮点
Chen_harmony1 小时前
二、顺序表
数据结构
BAGAE2 小时前
星链卫星数据获取:从太空安全到实时通信的技术革命
网络·数据结构·数据库·算法·云计算·hbase
h_a_o777oah2 小时前
【算法专项】扩展域并查集:原理详解及解决大部分种类并查集问题(洛谷P5937 P2024 C++代码)
数据结构·c++·算法·acm·并查集·扩展域·逻辑建模
吴阿福|一人公司3 小时前
深度解析 Python 类变量修改的命名空间隔离
java·服务器·数据结构
zzz_23683 小时前
【Java基础】链表的七十二变——从LRU缓存到手写浏览器前进后退
java·链表·缓存
不知名的老吴3 小时前
经典算法题之行星碰撞
数据结构·算法
丘山望岳3 小时前
剑起霜华——平衡二叉树(AVL树 )精讲
开发语言·数据结构·c++
LuminousCPP4 小时前
数据结构 - 单链表第一篇:单链表基础操作
c语言·数据结构·经验分享·笔记·学习
WL学习笔记4 小时前
通讯录(顺序表实现)
c语言·数据结构·算法