力扣: 回文链表

文章目录

需求

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

示例 1:

输入:head = [1,2,2,1]

输出:true

示例 2:

输入:head = [1,2]

输出:false
提示:

链表中节点数目在范围[1, 105] 内

0 <= Node.val <= 9
进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

分析

题意还是挺简单的, 我们可以先把链表遍历一遍, 将链表里的数据存到一个容器里面, 再拿容器里的数据和链表比较就行了, 想这里 , 栈 是再合适不过了, 我说的是数据结构里的栈, 注意不是下图里 的 zhan 啊.

思路到了这里, 其实代码也就跃然纸上了:

java 复制代码
public boolean isPalindrome(ListNode head) {
     //  全部放到栈里
    ListNode temp = head;
    Stack<Integer> stack = new Stack<>();
    while( temp != null ){
        stack.push(temp.val);
        temp = temp.next;
    }
    temp = head;
    while( temp != null ){
       if( temp.val != stack.pop() ){
           return false;
       }
       temp = temp.next;
    }
    return true;
}

代码解释:

首先,定义一个 temp 变量指向链表的头节点 head。

创建一个 Stack 类型的栈 stack,用于存储链表节点的值。

使用 while 循环遍历整个链表,将每个节点的值 temp.val 压入栈中,然后将 temp 移动到下一个节点 temp.next。遍历完成后,栈中保存了链表节点值的逆序。

重新将 temp 指向链表的头节点。

再次使用 while 循环遍历链表:

对于每个节点,弹出栈顶的值,并与当前节点的值进行比较。

如果当前节点的值与弹出的栈顶值不相等,则说明链表不是回文链表,返回 false。

否则,继续遍历下一个节点。

如果所有节点的值与栈中的值都匹配,则说明链表是回文链表,返回 true。

执行结果:

优化下

上面的解答解决了, 但是有些点事可以优化的, 在比较的过程中其实没有必要全部比较啊, 我们只需要拿前一半和后一半比较就行了 , 那么问题的关键就是拿到链表的长度, 然后再拿到中间节点就行了.

java 复制代码
public boolean isPalindrome(ListNode head) {
     //  全部放到栈里
    ListNode temp = head;
    Stack<Integer> stack = new Stack<>();
    int l = 0;
    while( temp != null ){
        stack.push(temp.val);
        temp = temp.next;
        l++;
    }
    temp = head;
    l = l / 2;
    while( l > 0 ){
       if( temp.val != stack.pop() ){
           return false;
       }
       temp = temp.next;
       l--;
    }
    return true;
}

结尾

以上 是我对这道算法的一些遐想和延伸, 可能不是最优解, 但是算法的优化嘛 本身就是一个思索的过程, 能在这个思索和迭代的过程中有所收获和乐趣就是在成长了, 欢迎大家一起来交流更多的解答...

相关推荐
坊钰33 分钟前
【Java 数据结构】移除链表元素
java·开发语言·数据结构·学习·链表
巫师不要去魔法部乱说1 小时前
PyCharm专项训练4 最小生成树算法
算法·pycharm
IT猿手1 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解GLSMOP1-GLSMOP9及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·算法·机器学习·matlab·强化学习
阿七想学习1 小时前
数据结构《排序》
java·数据结构·学习·算法·排序算法
王老师青少年编程1 小时前
gesp(二级)(12)洛谷:B3955:[GESP202403 二级] 小杨的日字矩阵
c++·算法·矩阵·gesp·csp·信奥赛
Kenneth風车2 小时前
【机器学习(九)】分类和回归任务-多层感知机(Multilayer Perceptron,MLP)算法-Sentosa_DSML社区版 (1)111
算法·机器学习·分类
eternal__day2 小时前
数据结构(哈希表(中)纯概念版)
java·数据结构·算法·哈希算法·推荐算法
APP 肖提莫2 小时前
MyBatis-Plus分页拦截器,源码的重构(重构total总数的计算逻辑)
java·前端·算法
OTWOL2 小时前
两道数组有关的OJ练习题
c语言·开发语言·数据结构·c++·算法
qq_433554543 小时前
C++ 面向对象编程:递增重载
开发语言·c++·算法