当前位置: 首页 > news >正文

【LeetCode】算法详解#13 ---回文链表

1.题目介绍

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

提示:

  • 链表中节点数目在范围[1, 105] 内
  • 0 <= Node.val <= 9

2.解决思路

        题目需求是判断一个链表是否是回文链表。在以往解决这类问题时,我们可以通过直接取中点然后操作一半的内容即可实现。但是这个题目中我们并不知道链表的长度,只知道头结点和下一个相邻节点,以此类推。所以要完成这个需求,我们只能想出另一种方式完成类似的过程。这里我推荐一种快慢指针的做法,即通过快慢指针找到链表的中点(快指针一次两步,慢指针一次一步,快指针到尾节点时慢指针此时指向链表中点),然后我们此时就可以使用一半链表对另一半链表进行比对得出结果

3.步骤讲解

        1.首先创建一个主方法isPalindrome用于执行大体流程

        2.判断头结点是否为null,为null则直接返回true

        3.使用快慢指针寻找链表中点,创建findMid方法,传入头结点,定义慢指针slow,快指针fast同时指向头结点。当快指针下一个节点不为null且下下个节点也不为null时,慢指针移动一步,快指针移动两步。循环退出时表示快指针遍历到了尾节点,此时慢指针指向的节点就是中点,将慢指针返回。

        4.将中点的下一个节点作为起始节点,把后一半链表进行反转,创建reverse方法,传入目标起始节点,利用双指针将链表翻转(与上一篇【LeetCode】算法详解#12 ---反转链表-CSDN博客类似),最终将反转之后的链表的头结点返回。

        5.建立循环,两个子链表的下一个节点都不为空时,不断遍历比较节点值是否相同,在遍历结束之前如果有一个值不相同,表示该链表不是回文链表,返回false。否则返回true

4.代码展示

public class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) { this.val = val; }ListNode(int val, ListNode next) { this.val = val; this.next = next; }}public boolean isPalindrome(ListNode head) {if (head == null){return true;}//快慢指针找中点ListNode mid = findMid(head);//翻转链表ListNode reverse = reverse(mid.next);//比较两部分值是否相同while (head != null && reverse != null){if (head.val != reverse.val){return false;}head = head.next;reverse = reverse.next;}return true;}public ListNode reverse(ListNode mid){ListNode prev = null;ListNode curr = mid;while (curr != null) {ListNode nextTemp = curr.next;curr.next = prev;prev = curr;curr = nextTemp;}return prev;}public ListNode findMid(ListNode head){ListNode slow = head;ListNode fast = head;while (fast.next != null && fast.next.next != null){slow = slow.next;fast = fast.next.next;}return slow;}

5.执行结果

在leetcode中测试用例平均耗时5ms 

内存分布58.25MB

http://www.dtcms.com/a/334522.html

相关文章:

  • Vue 3.5重磅更新:响应式Props解构,让组件开发更简洁高效
  • [Linux] Linux交换空间管理 Linux系统启动原理
  • 慧穗云开放平台 CDK 开票对接
  • echart中x的0位置出现柱子宽度被裁掉一部分的问题
  • 技术日记2025年08月16日
  • 基于FPGA的实时图像处理系统(1)——SDRAM回环测试
  • python---异常处理
  • Redis知识整理
  • 【论文笔记】STORYWRITER: A Multi-Agent Framework for Long Story Generation
  • 云服务平台主流架构的相关知识体系剖析
  • ABM和强化学习-2015年全国大学生数学建模竞赛B题
  • 安卓11 12系统修改定制化_____修改系统 解锁system分区 去除data加密 自由删减系统应用
  • JetPack系列教程(七):Palette——让你的APP色彩“飞”起来!
  • sql链接的url中serverTimezone的作用
  • 【大模型微调系列-04】 神经网络基础与小项目实战
  • windows环境下使用vscode以及相关插件搭建c/c++的编译,调试环境
  • GIMP:功能强大的跨平台图像处理软件
  • 嵌入式硬件篇---电容本质
  • leetcodehot100 矩阵置零
  • Jenkins安装部署(Win11)和常见配置镜像加速
  • B3837 [GESP202303 二级] 画三角形
  • csrf攻击
  • 11、软件需求工程
  • AMD Ryzen AI Max+ 395四机并联:大语言模型集群推理深度测试
  • 智能二维码刷卡人脸识别梯控控制器硬件规格书​
  • 【C++】高效资源管理四剑客:RVO、NRVO、std::move、RAII 深度解析
  • 【3D重建技术】如何基于遥感图像和DEM等数据进行城市级高精度三维重建?
  • 【Vibe Coding 工程之 StockAnalyzerPro 记录】- EP3.Phase 2股票列表管理功能
  • Font shape `TU/ptm/m/n‘ undefined(Font) using `TU/lmr/m/n‘ instead
  • UE5多人MOBA+GAS 45、制作冲刺技能