登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
科技
›
【忍者算法】从生活场景到回文链表:探索对称性检测|Le ...
【忍者算法】从生活场景到回文链表:探索对称性检测|LeetCode 234 回文链表
[ 复制链接 ]
辈霖利
2025-6-7 11:03:49
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
从生活场景到回文链表:探索对称性检测
生活中的回文现象
在日常生活中,回文无处不在。比如"上海自来水来自海上"、"12321"这样正着读和倒着读都一样的字符串或数字,就是回文。把这个概念扩展到链表,我们就得到了今天要讨论的回文链表问题:一个链表从前往后读和从后往前读的结果是否相同。
问题描述
LeetCode第234题"回文链表"要求:给你一个单链表的头节点 head,请判断该链表是否为回文链表。
例如:
输入:1 → 2 → 2 → 1
输出:true
输入:1 → 2 → 3 → 2 → 1
输出:true
输入:1 → 2 → 3 → 3 → 1
输出:false
复制代码
基础知识准备
这道题的核心是利用我们之前学过的"反转链表"。如果不熟悉链表反转,建议先复习上一篇文章。记住,链表反转是一块基石,在这里我们要用它来解决更复杂的问题。
直观解法:转换为数组
最简单的想法是:把链表转换成数组,然后用双指针从两端向中间移动比较。这就像把一摞扑克牌摊开在桌上,从两端开始对比每张牌是否相同。
数组法实现
public boolean isPalindrome(ListNode head) {
List<Integer> vals = new ArrayList<>();
// 将链表值复制到数组中
ListNode current = head;
while (current != null) {
vals.add(current.val);
current = current.next;
}
// 使用双指针判断是否回文
int left = 0, right = vals.size() - 1;
while (left < right) {
if (!vals.get(left).equals(vals.get(right))) {
return false;
}
left++;
right--;
}
return true;
}
复制代码
优化解法:反转后半部分
仔细思考,我们其实不需要额外的数组。可以用这个巧妙的方法:
找到链表中点
反转后半部分
比较前后两半是否相同
(可选)恢复链表原状
这就像把一叠纸牌分成两半,把后半部分倒过来,然后一张张对比。
寻找中点:快慢指针法
想象两个人在跑道上跑步,一个速度是另一个的两倍。当快跑者跑到终点时,慢跑者正好在中点!
详细代码实现
public boolean isPalindrome(ListNode head) {
if (head == null || head.next == null) {
return true;
}
// 第1步:找到中点
ListNode slow = head;
ListNode fast = head;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
// 第2步:反转后半部分
ListNode secondHalf = reverseList(slow.next);
// 第3步:比较两半是否相同
ListNode firstHalf = head;
ListNode temp = secondHalf; // 保存开始位置,用于之后恢复
boolean result = true;
while (secondHalf != null) {
if (firstHalf.val != secondHalf.val) {
result = false;
break;
}
firstHalf = firstHalf.next;
secondHalf = secondHalf.next;
}
// 第4步:恢复链表(可选)
slow.next = reverseList(temp);
return result;
}
// 链表反转函数(使用我们之前学过的方法)
private ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
复制代码
图解过程
以1→2→3→2→1为例:
1) 初始状态:
1 → 2 → 3 → 2 → 1
2) 找到中点:
1 → 2 → [3] → 2 → 1
slow指向3
3) 反转后半部分:
1 → 2 → 3 ← 2 ← 1
4) 比较两半:
(1 → 2) 和 (1 → 2) 比较
5) 恢复原状:
1 → 2 → 3 → 2 → 1
复制代码
复杂度分析
空间优化解法:
时间复杂度:O(n)
空间复杂度:O(1),只使用几个指针
优点:空间效率高,且思路优雅
缺点:修改了原链表结构(虽然最后恢复了)
重要思维方式总结
问题转化
:将回文判断转化为对称性比较
空间优化思维
:
不用额外数组存储
利用原有空间进行操作
分步思想
:
找中点(快慢指针)
反转后半段(链表反转)
对比(双指针)
恢复(再次反转)
边界处理
:
空链表
单节点链表
偶数/奇数长度的处理
实用技巧总结
解决类似问题的关键点:
熟练掌握基础操作(如链表反转)
善用快慢指针找中点
考虑空间优化的可能性
注意保护原始数据结构
相关的思维训练:
回文数判断
回文子串问题
链表中点问题
链表反转的各种变体
小结
回文链表问题是一个很好的例子,展示了如何将基础算法(如链表反转、快慢指针)组合起来解决更复杂的问题。它教会我们:
基础算法的重要性
空间优化的思维方式
问题分解的方法
代码的优雅性
下次遇到类似的对称性判断问题,不要急着用额外空间,想想是否可以通过改变数据结构本身来解决问题!
作者:忍者算法
公众号:忍者算法
我准备了一份刷题清单,以及这些题目的详细题解,覆盖了绝大部分常见面试题。我可以很负责任地说,只要你把这些题真正掌握了,80%的算法面试都能遇到相似题目。公众号回复【刷题清单】获取~
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回文
链表
忍者
算法
生活
相关帖子
zcash pow equihash算法详解
LLL格基约简算法(1)
secp256k1算法详解五(kG点乘多梳状算法)
LLL格基约简算法(2)
十大经典排序算法
朴素贝叶斯算法预测中文钓鱼邮件
目标追踪算法+卡尔曼滤波原理+ByteTrack使用
查找算法
【分析式AI】-朴素贝叶斯算法模型
【分析式AI】-朴素贝叶斯算法模型
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
zcash pow equihash算法详解
2
62
矛赓宁
2025-11-28
安全
LLL格基约简算法(1)
3
564
甘子萱
2025-12-05
业界
secp256k1算法详解五(kG点乘多梳状算法)
1
332
里豳朝
2025-12-05
安全
LLL格基约简算法(2)
1
1003
孜尊
2025-12-06
业界
十大经典排序算法
0
563
蓬庄静
2025-12-08
业界
朴素贝叶斯算法预测中文钓鱼邮件
0
661
坠矜
2025-12-08
业界
目标追踪算法+卡尔曼滤波原理+ByteTrack使用
1
480
娥搽裙
2025-12-09
业界
查找算法
2
37
崔瑜然
2025-12-12
业界
【分析式AI】-朴素贝叶斯算法模型
0
218
跑两獗
2025-12-16
业界
【分析式AI】-朴素贝叶斯算法模型
0
272
巫雪艷
2025-12-16
回复
(7)
求几少
2025-10-9 23:20:08
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
谢谢分享,辛苦了
匣卒
2025-10-23 06:38:54
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
感谢发布原创作品,程序园因你更精彩
瞿佳悦
2025-10-30 07:07:45
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
感谢,下载保存了
喜及眩
2025-11-2 02:40:26
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
用心讨论,共获提升!
胁冉右
2025-11-7 18:45:26
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
谢谢分享,试用一下
秦晓曼
2025-12-5 21:48:59
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
这个好,看起来很实用
薯羞
7 天前
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
不错,里面软件多更新就更好了
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
辈霖利
7 天前
关注
0
粉丝关注
23
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991124
anyue1937
9994893
kk14977
6845357
4
xiangqian
638210
5
韶又彤
9998
6
宋子
9983
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9951
查看更多
今日好文热榜
246
RSA加密
316
pydash原型链污染
176
大模型榜单周报(2025/12/08—2025/12/12)
849
当你不再迷信“最强模型”,系统设计才刚刚
876
软件i2c
301
2025年专业起名老师联系方式汇总:全国资深
652
解码IP协议号:网络世界的“货物运单”
712
Python Selenium 漫步指南:从入门到精通
643
AI 付费模式终极对比:ChatGPT、Gemini、Cl
838
JSAPIThree 加载 3D Tiles 学习笔记:大规
358
LLM 工具调用的范式演进与认知模型集成
355
Requirements Engineering with AI for Con
343
【节点】[Adjustment-WhiteBalance节点]原
303
上海专业建筑维修服务解析:标准化流程如何
947
【分析式AI】-带你弄懂XGBoost模型
731
【分析式AI】-带你弄懂XGBoost模型
53
【分析式AI】-带你弄懂XGBoost模型
274
C语言之统计天数
241
如何使用DashVector的多向量检索
272
【分析式AI】-朴素贝叶斯算法模型