Java:如何判断一个链表是否为回文结构?(画图+代码 详解)

news2024/11/25 5:55:28

一、判断思想

        我们设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,我们在不创建额外空间的基础上来判断是否为回文结构。

思想:

1、使用快慢指针法,找到链表的中间节点。

2、翻转中间节点的后半部分。

3、分别从头节点和尾节点向中间遍历,直到相遇。如果在这个过程中头尾节点数值都相              等,则该链表结构为回文结构。

二、过程分析(以偶数节点为例)

1、找中间节点

使用快慢指针法,slow走一步,fast走两步。当fast走到空时,slow就在中间节点初。

由此就能找到中间节点slow

ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
    slow = slow.next;
    fast = fast.next.next;
}

2、翻转后半部分链表

//2、翻转
ListNode cur = slow.next;

while (cur != null) {
    ListNode curNext = cur.next;
    cur.next = slow;
    slow = cur;
    cur = curNext;
}

3、遍历查找

如果是奇数情况,那么直接从后往前遍历,直到二者相遇即可;

如果是偶数情况,那么当二者的下一个节点为彼此时,就应该结束遍历了。

注意:单节点的链表是回文结构

三、代码实现

public class Main{
    public boolean chkPalindrome(ListNode head) {
        //找到中间节点 把链表翻转 一个从后往前走 一个从前往后走
        //如果二者相遇的时候还都是一样的,就证明链表是回文的
        //如果只有一个节点 那肯定是回文的
        if(head.next == null) {
            return true;
        }

        //翻转链表
        //1、使用快慢指针找到中间位置
        ListNode slow = head;
        ListNode fast = head;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        ListNode cur = slow.next;
        //2、翻转
        while (cur != null) {
            ListNode curNext = cur.next;
            cur.next = slow;
            slow = cur;
            cur = curNext;
        }
        //翻转完之后开始查找 (考虑奇偶情况 )
        while (head != slow) {
            if(head.val != slow.val) {
                return false;
            }
            if(head.next == slow) {
                return true;
            }
            head = head.next;
            slow = slow.next;
        }
        return true;
    }
}

        以上就是 Java:如何判断一个链表是否为回文结构?(画图+代码 详解)的全部内容了,希望能对您有所帮助! 您的点赞收藏就是对我最大的支持!

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

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

相关文章

网课:数独挑战——牛客(题解与疑问)

涉及知识点:打表 题目描述 数独是一种填数字游戏,英文名叫 Sudoku,起源于瑞士,上世纪 70 年代由美国一家数学逻辑游戏杂志首先发表,名为 Number Place,后在日本流行,1984 年将 Sudoku 命名为…

《合成孔径雷达成像算法与实现》Figure6.13

clc clear close all参数设置 距离向参数设置 R_eta_c 20e3; % 景中心斜距 Tr 2.5e-6; % 发射脉冲时宽 Kr 20e12; % 距离向调频率 alpha_os_r 1.2; % 距离过采样率 Nrg 320; % 距离线采样数 距离向…

springboot190基于springboot框架的工作流程管理系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

项目管理工具软件Maven趣闻

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl Maven这个单词来自于意第绪语(Yiddish),这是一种与德语和希伯来语有密切关系的犹太民族语言。在这个语境中,Maven意为“知识的…

分布式文件系统 SpringBoot+FastDFS+Vue.js【四】

分布式文件系统 SpringBootFastDFSVue.js【四】 八、文件的下载和删除功能8.1.FastDFSClient.java8.2.FileServerController.java8.3.Vue的fast.js8.4.fastdfsimg.vue8.5.效果 九、总结endl 八、文件的下载和删除功能 8.1.FastDFSClient.java Slf4j public class FastDFSClie…

Midjourney绘图欣赏系列(三)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子,它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同,Midjourney 是自筹资金且闭源的,因此确切了解其幕后内容尚不…

【机器学习笔记】8 决策树

决策树原理 决策树是从训练数据中学习得出一个树状结构的模型。 决策树属于判别模型。 决策树是一种树状结构,通过做出一系列决策(选择)来对数据进行划分,这类似于针对一系列问题进行选择。决策树的决策过程就是从根节点开始&…

指针的经典笔试题

经典的指针试题,让你彻底理解指针 前言 之前对于指针做了一个详解,现在来看一些关于指针的经典面试题。 再次说一下数组名 数组名通常表示的都是首元素的地址,但是有两个意外,1.sizeof(数组名)这里数组名…

Chat with RTX 安装

1、Chat With RTX 介绍 Chat With RTX 是一个 Demo,用来将您自己的资料(文档、笔记、视频或其他数据)与大语言模型建立连接,从而令 LLM 更具个性化。利用检索增强生成 (RAG)、TensorRT-LLM 和 RTX 加速,您可以与自定义…

GiantPandaCV | 视觉类表面缺陷检测项目相关技术总结

本文来源公众号“GiantPandaCV”,仅用于学术分享,侵权删,干货满满。 原文链接:视觉类表面缺陷检测项目相关技术总结 本文由海滨撰写,首发于GaintPandaCV。 零、前言 做这个方向的项目也有一段时间了,作为…

第9章 网络编程

9.1 网络通信协议 通过计算机网络可以实现多台计算机连接,但是不同计算机的操作系统和硬件体系结构不同,为了提供通信支持,位于同一个网络中的计算机在进行连接和通信时必须要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵…

代码随想录算法训练营第二十四天|回溯算法理论 77.组合

回溯算法理论 回溯和递归式相辅相成的,只要有递归就会有回溯一般 递归函数的下面就是 回溯的逻辑 回溯相当于穷举搜索的巧妙实现 回溯算法常解决的问题: 组合切割子集排列棋盘回溯代码的框架 void backtracking(参数) {if (终止条件) {存放结果;retu…

线性注意力机制全新升级!性能显著提高,速度、精度更优

线性注意力机制通过对传统注意力机制中的Softmax操作进行线性化处理,可以提高Transformer模型的并行性能、降低复杂度,在计算效率、模型表达能力等方面都具有优势。 作为一种常用有效的优化方法,线性注意力机制可以在保证模型性能的同时提高…

cefsharp121(cef121.3.7Chromium121.0.6167.160)升级测试及其他H264版本

一、版本说明 1.1 本此版本 此版本CEF 121.3.7+g82c7c57+chromium-121.0.6167.160 / Chromium 121.0.6167.160 1.2 其他支持H264版本 支持H264推荐版本:V100,V109,V111,V119版本,其他V114,V115,V108,V107 支持win7/win8/win8.1最后版本v109.x 支持NET4.5.2最后版本v114.x …

Linux rp_filter、arp_filter、arp_ignore、arp_announce参数说明

Linux rp_filter、arp_filter、arp_ignore、arp_announce参数说明。我查看了参考资料,又去查阅了官方文档,凭着我的理解整理了以下文档。各位大神的文档写的很好,但都不喜欢断句啊,读的我这叫一个累。 参考 1.网络编程之网络丢包…

PPT导出PDF时保持图像高清的方法

问题: 我们经常会发现,在PPT中插入的图片非常高清,但是通过PPT转换为PDF之后,图片就会出现不同程度的失真。 问题产生的原因: 这是因为Acrobat的PDF Maker在将PPT转换为PDF的时候,对PPT中的图片进行了压缩 Solution: 在PPT的…

c++ Qt 数据库操作

1、准备工作 Qt本身并没有数据库功能,但是Qt支持调用其他主流的数据库产品,并且这些数据库产品统一了Qt的接口,实际上是一种数据库的中间件。 Qt支持以下数据库类型: 嵌入式常用的数据库是sqlite3,本体只有几兆大小。非…

win7自带截图工具保存失效解决办法

今日发现一台远航技术的win7中自带的截图工具使用时正常,保存图片时没有弹出保存位置的对话窗口,无法正常保存图片。解决方案如下: 1、进入注册表编辑器。开始-搜索程序和文件-输入 regedit 按下回车键,打开注册表; 2、…

auto关键字详讲

目录 1.问题思考 2.auto关键字介绍 3. 早期auto的缺陷: 4.什么叫自动存储器? 5. c标准auto关键字 5.1auto的使用细节 5.2 auto什么时候不能推导变量的类型呢? 5.3基于范围的for循环 5.3.1范围for的用法 5.3.2 范围for的使用条件 6.…

家庭动态网络怎么在公网访问主机数据?--DDNS配置(动态域名解析配置)

前言 Dynamic DNS是一个DNS服务。当您的设备IP地址被互联网服务提供商动态变更时,它提供选项来自动变更一个或多个DNS记录的IP地址。 此服务在技术术语上也被称作DDNS或是Dyn DNS 如果您没有一个静态IP,那么每次您重新连接到互联网是IP都会改变。为了避免每次IP变化时手动更…