回文链表判断

回文字符串和数组我们会经常遇到,今天讲一个相关问题,叫回文链表,还是和以前一样,先把代码提上来。

	// need O(1) extra spacepublic static boolean isPalindrome3(Node head) {if (head == null || head.next == null) {return true;}Node n1 = head;Node n2 = head;while (n2.next != null && n2.next.next != null) { // find mid noden1 = n1.next; // n1 -> midn2 = n2.next.next; // n2 -> end}// n1 中点n2 = n1.next; // n2 -> right part first noden1.next = null; // mid.next -> nullNode n3 = null;while (n2 != null) { // right part convertn3 = n2.next; // n3 -> save next noden2.next = n1; // next of right node convertn1 = n2; // n1 moven2 = n3; // n2 move}n3 = n1; // n3 -> save last noden2 = head;// n2 -> left first nodeboolean res = true;while (n1 != null && n2 != null) { // check palindromeif (n1.value != n2.value) {res = false;break;}n1 = n1.next; // left to midn2 = n2.next; // right to mid}n1 = n3.next;n3.next = null;while (n1 != null) { // recover listn2 = n1.next;n1.next = n3;n3 = n1;n1 = n2;}return res;}

这段代码比传统方式要快很多,下面讲一下具体的流程:

  1. if (head == null || head.next == null):首先检查链表是否为空或只包含一个节点,因为这种情况下链表必然是回文,所以直接返回 true

  2. 初始化两个指针 n1n2 都指向链表的头节点 head。这两个指针将用于查找链表的中间节点。

  3. 进入一个循环,条件是 n2.next != null && n2.next.next != null,循环中 n1 每次移动一步,而 n2 每次移动两步,这样当 n2 到达链表尾部时,n1 恰好指向链表的中间节点(如果链表长度为奇数,则中间节点只有一个;如果链表长度为偶数,则中间节点有两个,这里 n1 指向靠左的那一个)。

  4. n2 移动到 n1 的下一个节点,这是为了将链表分为两部分:左边部分和右边部分。

  5. 断开 n1n2 之间的连接,即将 n1.next 设置为 null,从而分割链表为两个独立的部分。

  6. 接下来是将右边部分(后半部分)的链表反转。使用三个指针 n1n2n3 分别指向当前节点、下一个节点和用于保存下下一个节点。通过循环,不断将当前节点的 next 指针反向指向前一个节点,完成链表的反转。

  7. 在反转完成后,n3 会指向反转后链表的头节点,而 n2 则指向左边部分链表的头节点。同时, n1 指向 n3,表示将 n1 移动到反转链表的头节点位置。

  8. 接下来,使用两个指针 n1n2 同时遍历左边部分和反转后的右边部分,比较它们的值是否相等。如果有任何不相等的情况出现,将 res 设置为 false,表示链表不是回文。

  9. 最后,需要将右边部分的链表再次反转回来,以恢复原始链表的结构。这是通过循环和指针操作实现的。

  10. 返回 res,表示是否判断链表为回文。

 

假设输入链表为:1 -> 2 -> 3 -> 2 -> 1

  1. 首先找到链表的中间节点,n1 指向节点 3。

  2. 将右边部分反转,得到链表:1 -> 2 -> 3 和 1 -> 2。

  3. 通过比较左右两边部分的值,发现它们是回文的。

  4. 最后将右边部分反转回来,得到原始链表:1 -> 2 -> 3 -> 2 -> 1。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/76908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何把视频格式转换成mp4?支持的格式种类非常多。

如何把视频格式转换成mp4?随着计算机技术的迅猛发展,我们现在有着各种各样的视频格式可供选择,平时我们都知道的mp4、flv、mov、mkv、avi、wmv等,都是视频格式的种类。其中,MP4是一种具有极佳兼容性的视频格式&#xf…

TikTok魔法:揭秘那个“神奇”的算法

嘿,你是不是每次打开TikTok,都感觉这个应用好像了解你的内心世界一样?没错,背后有一个不为人知、神奇的算法正在起作用,让你欲罢不能。在这篇文章中,我们将揭开TikTok算法的神秘面纱,看看它是如…

车机多用户系统的适配问题

多用户问题出现背景 记录一下多用户的适配问题: 背景是system/app下面新push了两个apk,一个是我们的业务场景apk一个是虚拟车CarService服务的apk,我们的apk需要链接CarService服务通过AIDL通信。 下面这两张图是未roo的情况(当…

Python之Xlwings操作excel

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、xlwings简介二、安装与使用1.安装2.使用3.xlwings结构说明 二、xlwings对App常见的操作App基础操作工作簿的基础操作工作表的基础操作工作表其他操作 读取单元格…

JDK常用诊断工具

工具描述javapJava 反编译工具,主要用于根据 Java 字节码文件反汇编为 Java 源代码文件jcmdJava 命令行(Java Command),用于向正在运行的 JVM 发送诊断命令请求jconsole图形化用户界面的监测工具,主要用于监测并显示运行于 Java 平台上的应用程序的性能和资源占用等信息jdeps用…

移动端调试工具vConsole

安利一款好用的移动端调试工具vConsole vConsole 是腾讯推出的一个轻量、可拓展、针对手机网页的前端开发者调试面板。 官网:https://alloyteam.github.io/AlloyLever/ 特性 查看 console 日志查看网络请求查看页面 element 结构查看 Cookies、localStorage 和 SessionStor…

MOV导出序列帧并在Unity中播放

MOV导出序列帧并在Unity中播放 前言项目将MOV变成序列帧使用TexturePacker打成一个图集将Json格式精灵表转换为tpsheet格式精灵表导入Unity并播放总结 鸣谢 前言 收集到一批还不错的MG动画,想要在Unity中当特效播放出来,那首先就得把MOV变成序列帧&…

堆排序与TopK问题

一、堆排序 堆排序(升序):堆排序的思想就是先用数组模拟建大堆,然后把根结点与最后一个结点值交换,最后一个结点的值就是最大值,然后再把前(n-1)个元素重新建大堆,然后根结点与最后一个结点值交换,就找出了…

小红书笔记爬虫

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…

LNMP架构搭建论坛

目录 一、LNMP简介: 二、LNMP搭建: 1.前提准备: 关闭防火墙和安全机制: 2.编译安装nginx: 3.编译安装mysql: 3.1 安装依赖环境: 3.2 创建mysql运行用户: 3.3 编译安装&#xff1a…

c语言练习题52:写一个函数判断当前机器是大端还是小端

代码&#xff1a; #include<stdio.h> int check_sys() {int a 1;return *(char*)&a;//小端retrun 1 大端return 0&#xff1b; } int main() {if (check_sys() 1) {printf("小端\n");}elseprintf("大端\n"); } 这里首先取a的地址&#xff0c…

docker部署nginx总结和踩坑

部署脚本 docker run --name nginx -v C://docker/nginx/nginx.conf:/etc/nginx/nginx.conf -v C://docker/nginx/conf.d/:/etc/nginx/conf.d/ -v C://docker/nginx/html:/usr/share/nginx/html -p 80:80 -d nginx前提 需要创建目录 C://docker/nginx/ 准备3个文件 C://docke…

js面试题(更新中...)

js面试题&#xff08;更新中...&#xff09; 1.js类型及检测方式JS内置类型数据类型检验 1.js类型及检测方式 JS内置类型 原始数据类型&#xff1a;基础类型存储在栈内存&#xff0c;被引用或拷贝时&#xff0c;会创建一个完全相等的变量&#xff1b;占据空间小、大小固定&am…

原型链(一定要搞懂啊!!!>-<)

一、概念 1、prototype 习惯称作“显示原型”&#xff0c;只有构造函数才有的属性。 2、构造函数 能用new关键字创建的对象叫做构造函数 3、__proto__ 习惯称作“隐式原型”&#xff0c;每一个实例都有的属性&#xff0c;该属性指向他构造函数的“显示原型”。Function对象…

2.14 PE结构:地址之间的转换

在可执行文件PE文件结构中&#xff0c;通常我们需要用到地址转换相关知识&#xff0c;PE文件针对地址的规范有三种&#xff0c;其中就包括了VA&#xff0c;RVA&#xff0c;FOA三种&#xff0c;这三种该地址之间的灵活转换也是非常有用的&#xff0c;本节将介绍这些地址范围如何…

如何实现Spring的事务管理功能:@Transactional声明式事务

在Spring MVC中处理SQL事务&#xff0c;可以使用Spring的事务管理功能来实现。Spring提供了多种配置和编程方式来管理事务&#xff0c;以下是一种常见的基于注解的方法来处理SQL事务&#xff1a; 1. 配置数据源和事务管理器&#xff1a;首先&#xff0c;您需要配置数据源和事务…

Mac端交互式原型设计 Axure RP 8 for Mac汉化

Axure RP 8是一款专业的交互原型设计工具&#xff0c;它被广泛应用于用户体验设计、界面设计和产品原型制作等领域。该软件提供了丰富的功能和工具&#xff0c;使用户能够创建出具有高度交互性和可视化效果的原型。 Axure RP 8的主要特点和功能包括&#xff1a; 1. 快速原型&a…

产教融合 | 力软联合重庆科技学院开展低代码应用开发培训

近日&#xff0c;力软与重庆科技学院联合推出了为期两周的低代码应用开发培训课程&#xff0c;来自重庆科技学院相关专业的近百名师生参加了此次培训。 融合研学与实践&#xff0c;方能成为当代数字英才。本次培训全程采用线下模式&#xff0c;以“力软低代码平台”为软件开发…

光谱通用款积分球

随着惯性约束聚变&#xff08;ICF&#xff09;物理理论的不断发展以及精密物理实验要求的不断提高&#xff0c;激光驱动器的光束路数急剧增多&#xff0c;光路长度和元器件数目成倍增长。模块化是新一代激光驱动器的发展趋势。对于高功率激光多参数测量系统&#xff0c;模块化设…

《DevOps实践指南》- 读书笔记(五)

DevOps实践指南 Part 4 第二步 &#xff1a;反馈的技术实践14. 建立能发现并解决问题的遥测系统14.1 建设集中式监控架构14.2 建立生产环境的应用程序日志遥测14.3 使用遥测指导问题的解决14.4 将建立生产遥测融入日常工作14.5 建立自助访问的遥测和信息辐射器14.6 发现和填补遥…