剑指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;
};
相关推荐
自信的小螺丝钉2 分钟前
Leetcode 876. 链表的中间结点 快慢指针
算法·leetcode·链表·指针
红豆怪怪3 分钟前
[LeetCode 热题 100] 32. 最长有效括号
数据结构·python·算法·leetcode·动态规划·代理模式
AI 嗯啦20 分钟前
计算机的排序方法
数据结构·算法·排序算法
_Coin_-1 小时前
算法训练营DAY58 第十一章:图论part08
数据结构·算法·图论
阿方.9181 小时前
《数据结构全解析:栈(数组实现)》
java·开发语言·数据结构
小欣加油2 小时前
leetcode 912 排序数组(归并排序)
数据结构·c++·算法·leetcode·排序算法
zl_dfq3 小时前
数据结构 之 【模拟实现哈希表】
数据结构
苏小瀚11 小时前
[数据结构] ArrayList(顺序表)与LinkedList(链表)
数据结构
Kevinhbr15 小时前
CSP-J/S IS COMING
数据结构·c++·算法
Armyyyyy丶15 小时前
Redis底层实现原理之五大基础结构
数据结构·redis·缓存