首页/新闻资讯/正文详情

回文链表判断:从基础到进阶的两种解法

发布时间:2026/11/7 6:10:49 来源:云帆数科 栏目:资讯中心
回文链表判断:从基础到进阶的两种解法
1. 从零开始理解回文链表问题第一次看到这个题目时我脑海中浮现的是小时候玩过的回文游戏——正着读和反着读都一样的词语或句子。但把这个概念放到链表中就变得有点棘手了。单链表不像数组那样可以随机访问它的单向性让回文判断变得不那么直观。1.1 什么是回文链表回文链表指的是链表节点的值序列正读和反读都相同的链表。举个例子1-2-2-1 是回文链表1-2-3-2-1 也是回文链表1-2-3 则不是回文链表理解这个概念后我们需要思考如何在代码中实现这个判断。链表不像数组那样可以直接通过索引访问任意元素这是我们需要克服的主要难点。1.2 问题分析链表结构的特点是单向性只能从头节点开始依次访问无随机访问不能像数组那样直接通过索引访问任意元素空间效率不需要预先分配固定大小的空间这些特性使得判断回文链表比判断回文字符串或数组更具挑战性。我们需要找到既能准确判断又尽可能高效的方法。2. 基础解法数组辅助法2.1 思路详解我的第一个想法很简单既然链表不方便直接比较那就把它转换成更方便比较的数据结构——数组。具体步骤如下遍历链表将所有节点的值存入数组使用双指针法一个指向数组开头(left)一个指向数组末尾(right)比较两个指针指向的值如果相等则left右移right左移继续比较如果不相等立即返回false如果所有比较都通过返回true这种方法直观易懂时间复杂度为O(n)空间复杂度也是O(n)因为需要额外的数组存储链表值。2.2 代码实现与解析/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: bool isPalindrome(ListNode* head) { vectorint temp; ListNode* p head; // 将链表值存入数组 while(p ! nullptr){ temp.push_back(p-val); p p-next; } // 设置双指针 auto left temp.begin(); auto right temp.end() - 1; // 注意这里要减1 // 比较头尾 while(left right){ if(*left ! *right){ return false; } left; right--; } return true; } };注意使用vector的end()时它返回的是最后一个元素的下一个位置所以我们需要用end()-1来获取真正的最后一个元素。这是一个常见的陷阱我在第一次实现时就掉进去了。2.3 复杂度分析时间复杂度O(n)遍历链表存入数组O(n)双指针比较O(n/2) ≈ O(n)空间复杂度O(n)需要额外数组存储所有节点值虽然这种方法简单直观但它的空间复杂度不是最优的。对于内存敏感的场景我们需要寻找更高效的解决方案。3. 进阶解法快慢指针法3.1 算法思路为了优化空间复杂度我们可以考虑在链表本身上进行操作。核心思路是找到链表的中间节点反转链表的后半部分比较前半部分和反转后的后半部分恢复链表原状可选这种方法的空间复杂度可以优化到O(1)因为我们只使用了常数个额外指针。3.2 详细步骤拆解3.2.1 寻找中间节点使用快慢指针技巧快指针每次移动两步慢指针每次移动一步当快指针到达末尾时慢指针正好在中间对于奇数长度链表慢指针会停在正中间对于偶数长度会停在前半部分的最后一个节点。3.2.2 反转后半部分链表使用经典的链表反转方法初始化prev为nullptrcurr为后半部分头节点遍历后半部分链表保存curr的下一个节点nextTemp将curr的next指向prevprev移动到currcurr移动到nextTemp最后prev就是反转后的链表头3.2.3 比较前后两部分同时遍历原始链表的前半部分和反转后的后半部分比较每个节点的值如果所有值都相同则是回文链表如果发现不同则不是回文链表3.2.4 恢复链表可选虽然题目不要求恢复链表但这是一个好习惯特别是当链表还需要后续使用时。3.3 完整代码实现class Solution { public: bool isPalindrome(ListNode* head) { if (head nullptr) { return true; } // 找到前半部分链表的尾节点 ListNode* firstHalfEnd endOfFirstHalf(head); // 反转后半部分链表 ListNode* secondHalfStart reverseList(firstHalfEnd-next); // 判断是否回文 ListNode* p1 head; ListNode* p2 secondHalfStart; bool result true; while (result p2 ! nullptr) { if (p1-val ! p2-val) { result false; } p1 p1-next; p2 p2-next; } // 还原链表并返回结果 firstHalfEnd-next reverseList(secondHalfStart); return result; } // 反转链表 ListNode* reverseList(ListNode* head) { ListNode* prev nullptr; ListNode* curr head; while (curr ! nullptr) { ListNode* nextTemp curr-next; curr-next prev; prev curr; curr nextTemp; } return prev; } // 使用快慢指针找到前半部分的尾节点 ListNode* endOfFirstHalf(ListNode* head) { ListNode* fast head; ListNode* slow head; while (fast-next ! nullptr fast-next-next ! nullptr) { fast fast-next-next; slow slow-next; } return slow; } };3.4 复杂度分析时间复杂度O(n)找到中间节点O(n/2)反转后半部分O(n/2)比较前后部分O(n/2)恢复链表O(n/2)空间复杂度O(1)只使用了固定数量的额外指针这种方法虽然代码量稍大但空间效率更高适合处理大规模链表。4. 常见问题与调试技巧4.1 边界条件处理在实现过程中有几个边界条件需要特别注意空链表应该返回true因为空链表可以认为是回文的单节点链表自然也是回文的双节点链表需要比较这两个节点的值4.2 调试技巧在调试链表问题时我通常会先画出链表的结构图在关键步骤打印链表状态使用小规模测试用例如1-2个节点验证边界条件逐步增加测试用例复杂度4.3 性能优化思考虽然快慢指针法已经很高效但还可以考虑并行化理论上可以同时进行找中间节点和反转操作提前终止在比较过程中发现不匹配时立即终止位操作如果节点值范围有限可以考虑位运算优化不过在实际应用中O(n)时间复杂度和O(1)空间复杂度已经足够优秀通常不需要进一步优化。5. 方法对比与选择建议5.1 两种方法对比特性数组辅助法快慢指针法时间复杂度O(n)O(n)空间复杂度O(n)O(1)是否修改原链表否是但可恢复实现难度简单中等适用场景小规模链表内存充足大规模链表内存敏感5.2 选择建议如果内存不是问题追求简单实现选择数组辅助法如果需要最优空间效率或处理大规模链表选择快慢指针法如果链表后续还要使用且不能修改选择数组辅助法或使用快慢指针法后恢复链表在实际面试中通常建议先提出数组辅助法然后进一步优化到快慢指针法展示你的思考过程。6. 扩展思考与变种问题6.1 类似问题掌握了回文链表的判断方法后可以尝试解决以下类似问题判断字符串/数组是否是回文找出链表中最长的回文子链表将链表转换为回文链表的最小操作次数6.2 递归解法除了迭代方法还可以考虑递归解法。递归可以模拟从链表两端向中间比较的过程但空间复杂度仍然是O(n)因为递归栈且实现起来可能不如迭代方法直观。6.3 实际应用场景回文链表的判断虽然看似简单但它涉及了链表遍历、反转、双指针等多个基础技巧这些技巧在以下场景中都有应用内存受限环境下的数据处理链表相关的算法优化编译器优化中的模式匹配7. 个人实践心得在实际编码过程中我总结了以下几点经验测试用例设计除了常规测试一定要考虑空链表、单节点链表、全相同值链表等边界情况。代码可读性即使算法很巧妙也要保持代码清晰。比如将找中间节点和反转链表封装成独立函数。链表操作安全修改链表结构前要考虑是否需要保留原链表。在面试中即使题目不要求提到恢复链表也是一个加分项。调试技巧对于链表问题画图是最有效的调试方法之一。在纸上画出每个步骤后的链表状态能快速定位问题。性能权衡不要一味追求空间效率而牺牲代码可读性。在实际工程中有时O(n)的空间开销是可以接受的特别是当n不大时。最后这道题的价值不仅在于解决回文判断问题本身更在于它综合考察了对链表的理解和操作能力。通过这道题我巩固了快慢指针、链表反转等基础技巧这对解决更复杂的链表问题大有裨益。

相关推荐

鸿蒙PDF页眉页脚处理方案与优化实践
鸿蒙PDF页眉页脚处理方案与优化实践

1. 项目概述在文档处理领域,PDF的页眉页脚操作一直是高频需求场景。最近在鸿蒙应用开发过程中,我发现系统原生PDF处理能力对页眉页脚的操作支持较为基础,而社区也缺乏针对性的实践指南。本文将分享我在鸿蒙环境下实现PDF页眉页脚增删改查的完… · 2026/11/6 4:35:35

CAD二次开发DBText对齐方式与批量居中实战
CAD二次开发DBText对齐方式与批量居中实战

把一条“把图签文字全部居中”的脚本交给同事之后,我以为这事就完了。第二天他把测试图甩回来,图框里二十几个字段全挤到了坐标原点附近,像被人拿橡皮擦推了一把。我第一反应是“插入点算错了”,打开代码一看,插入点算… · 2026/11/6 4:35:35

Cber经纪人体系:共识价值共享的合伙人机制解析
Cber经纪人体系:共识价值共享的合伙人机制解析

1. 经纪人体系转型背景解析在传统金融交易模式中,交易者与平台的关系往往停留在简单的服务提供与使用层面。这种单向关系存在明显的局限性:交易者的忠诚度难以培养,平台生态缺乏粘性,而交易者自身也无法从平台发展中获得长期收益。… · 2026/11/6 4:35:35

电工证没审是否能补办?电子证书怎么用?南阳人别慌!
电工证没审是否能补办?电子证书怎么用?南阳人别慌!

电工证没审是否能补办?电子证书怎么用?南阳人别慌! 之前考的证在外省能不能转过来?别急,这事儿我帮你看明白了。现在很多电工在外地工作,证书没来得及审,或者因为各种原因错过了复审,最担心的就是证书失效了,那怎么办?还能不能补办?答案是:… · 2026/11/7 12:40:42

银川低压电工证考证怎么选?上岗必备的证书别被中介骗了
银川低压电工证考证怎么选?上岗必备的证书别被中介骗了

银川低压电工证考证怎么选?上岗必备的证书别被中介骗了 你是不是正愁不知道去哪里报银川低压电工证,怕被中介坑了钱还拿不到证?别急,今天咱们就来聊聊 银川低压电工证考证 这事儿,尤其是 上岗必备 的电工证,怎么选靠谱机构、怎么备考、怎么避坑。… · 2026/11/7 12:40:42

离职后电工证解绑多久拿证?别被中介坑了
离职后电工证解绑多久拿证?别被中介坑了

离职后电工证解绑多久拿证?别被中介坑了 你是不是也遇到过这种情况,干了几年电工,突然换工作,结果发现电工证还在原单位名下,想解绑又不知道流程,还怕被中介骗钱?别急,这篇文章就带你从头理清楚【离职后电工证解绑】这个事儿,告诉你多久能拿到证,怎… · 2026/11/7 12:40:42

离职后电工证解绑怎么操作?上岗必备流程全在这儿了
离职后电工证解绑怎么操作?上岗必备流程全在这儿了

离职后电工证解绑怎么操作?上岗必备流程全在这儿了 不知道去哪报名怕被中介坑?你不是一个人。洛阳不少应届工程类毕业生刚拿到电工证,离职后却发现证书还在原单位绑定,想重新找工作、换岗位、找兼职都受限,只能先想办法把电工证解绑。这事儿听起来简单,… · 2026/11/7 12:40:42

电工证复审照片要几张?真实经历告诉你别踩坑
电工证复审照片要几张?真实经历告诉你别踩坑

电工证复审照片要几张?真实经历告诉你别踩坑 你是不是正在为电工证复审发愁?手头的证件快到期了,却不知道要准备几张照片,更别提复审流程有多复杂了。这种焦虑我太懂了,我自己也曾在洛阳公路工程一线干过几年,那会儿电工证是干现场必须的,要是到期了没… · 2026/11/7 12:40:42

电工作业两票一证官方回应:证书过期了不知道怎么复审延期怎么办?
电工作业两票一证官方回应:证书过期了不知道怎么复审延期怎么办?

电工作业两票一证官方回应:证书过期了不知道怎么复审延期怎么办? 证书过期了不知道怎么复审延期?很多电工作业人员都遇到过这个问题,尤其是在现场施工或管理岗位,证书的有效性直接影响到项目进度和自身职业发展。官方回应也明确指出,特种作业操作证需定… · 2026/11/7 12:39:42

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 11:25:08

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 12:02:18

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23

澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄?
澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄?

澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄? 证书过期了不知道怎么复审延期?别慌,很多人在拿到【澳洲水电工证考试】的电子证书后,一不小心就忽略了复审时间,结果证书失效,工作受阻,甚至被单位追责。今天就从【澳洲水电工证考试… · 2026/11/7 0:00:41

电工作业提示版通过率揭秘:怎么考才能一次过?
电工作业提示版通过率揭秘:怎么考才能一次过?

电工作业提示版通过率揭秘:怎么考才能一次过? 怕考不过白交培训费?别急,今天我就从驻马店应届工程类毕业生的视角,带你全面了解电工作业提示版的考试流程、备考要点和真实通过率,帮你少走弯路、提高一次通过率。… · 2026/11/7 0:00:41

电工证年审报名千万别踩坑 外省证转过来要搞清这几点
电工证年审报名千万别踩坑 外省证转过来要搞清这几点

电工证年审报名千万别踩坑 外省证转过来要搞清这几点 之前考的证在外省能不能转过来?这个问题是很多电工从业者最关心的,特别是像你这样在商丘从事公路工程的人员,经常需要跨省流动,证书的 有效性 和 可迁移性… · 2026/11/7 0:00:41

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 11:25:08

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 12:02:18

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码