欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > 力扣: 回文链表

力扣: 回文链表

2024/10/25 21:32:46 来源:https://blog.csdn.net/Snowyyds/article/details/141848224  浏览:    关键词:力扣: 回文链表

文章目录

  • 需求
  • 分析
  • 优化下
  • 结尾

在这里插入图片描述


需求

给你一个单链表的头节点 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 啊.

在这里插入图片描述

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

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。


执行结果:


在这里插入图片描述


优化下

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

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;
}

在这里插入图片描述


结尾

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





版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com