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

一、判断思想

        我们设计一个时间复杂度为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:如何判断一个链表是否为回文结构?(画图+代码 详解)的全部内容了,希望能对您有所帮助! 您的点赞收藏就是对我最大的支持!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode刷题计划

LeetCode刷题计划 推荐 代码随想录&#xff1a;https://github.com/youngyangyang04/leetcode-master 卡码网 练习ACM模式 https://kamacoder.com/ 01 #include <iostream> using namespace std;int main() {int a ,b;while(cin>>a>>b){cout<<ab<…

从汇编分析C语言可变参数的原理,并实现一个简单的sprintf函数

C语言可变参数 使用printf等函数的时候函数原型是printf(const char* fmt, ...), 这一类参数的个数不限的函数是可变参数 使用 使用一个头文件stdarg.h, 主要使用以下的宏 typedef char * va_list;// 把 n 圆整到 sizeof(int) 的倍数 #define _INTSIZEOF(n) ( (sizeo…

IO流---字节输入输出流,字符输入输出流

IO流概述 IO流&#xff0c;即输入输出流&#xff08;Input Output Stream&#xff09;&#xff0c;是一种抽象概念&#xff0c;用来处理设备之间的数据传输问题&#xff0c;例如文件复制、文件上传、文件下载等。在Java中&#xff0c;对数据的操作通常是通过流的方式进行的&…

幻兽帕鲁云服务器搭建零基础教程,新手小白一看就会

以下教程基于阿里云服务器ECS 来搭建幻兽帕鲁游戏服务器&#xff0c;通过一键部署的方式&#xff0c;最快1分钟即可完成部署。 阿里云一键部署幻兽帕鲁的活动地址&#xff1a;1分钟畅玩&#xff01;一键部署幻兽帕鲁联机服务器 首先&#xff0c;打开阿里云的这个游戏服务器活…

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

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

二维数组传参的本质(详解)

目录 一、前言二、分析本质三、总结 一、前言 有时候我们有⼀个⼆维数组的需要传参给⼀个函数的时候&#xff0c;我们是这样写的&#xff1a; #include <stdio.h> void test(int a[3][5], int r, int c) {int i 0;int j 0;for (i 0; i < r; i){for (j 0; j <…

网络安全问题概述

1 计算机网络面临的安全性威胁 两大类威胁&#xff1a;被动攻击和主动攻击。 被动攻击 指攻击者从网络上窃听他人的通信内容。 通常把这类攻击称为截获。 攻击者只是观察和分析某一个协议数据单元 PDU&#xff0c;以便了解所交换的数据的某种性质&#xff0c;但不干扰信息…

【PyQt】11-QTextEdit、QPushButton

文章目录 前言一、文本输入-QTextEdit1.1 代码1.2 运行结果 二、QPushButton2.1.1 按钮上添加文本2.1.2 按键的弹跳效果2.1.3 两个信号可以绑定一个槽。2.1.4 带图标的按键运行结果 2.1.5 按键不可用以及回车默认完整代码2.2 单选按键控件运行结果 2.3 复选框&#xff08;多选框…

1Coze平台介绍

2023年随着OpenAI推出GPT 3.5&#xff0c;AI赛道变得更加火热。GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;用于生成文本、理解语言和进行各种语言任务。GPT是由OpenAI开发的&#xff0c;它…

Python 异常处理及程序调试

Python 是一门功能强大而又易于学习的编程语言&#xff0c;它提供了丰富的工具和库来帮助开发者编写高效、稳定的程序。然而&#xff0c;在编写复杂的应用程序时&#xff0c;错误和异常是难以避免的。本文将介绍 Python 中的异常处理机制以及程序调试技巧&#xff0c;帮助读者提…

枚举,#define,C中程序内存区域划分

目录 一、枚举 1.1枚举类型的声明 1.2枚举类型的优点 1.3枚举类型的使用 二、#define定义常量 三、C中程序内存区域划分 一、枚举 1.1枚举类型的声明 枚举顾名思义就是⼀⼀列举。 把可能的取值⼀⼀列举。 比如我们现实生活中&#xff1a; ⼀周的星期⼀到星期日是有限…

【AIGC】Stable Diffusion 的提示词入门

一、正向提示词和反向提示词 Stable Diffusion 中的提示词通常用于指导用户对生成的图像进行控制。这些提示词可以分为正向提示词&#xff08;Positive Prompts&#xff09;和反向提示词&#xff08;Negative Prompts&#xff09;两类&#xff0c;它们分别影响图像生成过程中的…

MATLAB计算极限和微积分

一.函数与极限 计算极限&#xff1a;lim(3*x^2/(2x1))&#xff0c;x分别趋于0和1&#xff0c;代码如下&#xff1a; syms x; limit(3*x*x/(2*x1),x,0) limit(3*x*x/(2*x1),x,1) 结果分别为0和1&#xff1a; 1.计算双侧极限 计算极限&#xff1a;lim(3*x^2/(2x1))&#xff0…

输入输出自定义映射矩阵(数据结构树)

输出自定义FC其它算法实现&#xff0c;可以参考下面文章&#xff1a; https://rxxw-control.blog.csdn.net/article/details/125994252https://rxxw-control.blog.csdn.net/article/details/125994252下面我们看下我们的控制要求。在学习本篇博客之前大家可以熟悉下数据结构图…

内网横向渗透-1

目录 内网横向渗透 流量监听工具的使用 ARP欺骗 工具使用 服务密码攻击 hydra medusa ncrack hashcat 内网横向渗透 流量监听工具的使用 ARP欺骗 工具使用 ettercap 工具 可以进行arp欺骗、DNS欺骗&#xff0c;网络钓鱼等等&#xff01; driftnet -i eth0 可以用来…

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

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

在Postgresql 下安装QGIS

一.打开 Application Stack Builder 二.选择默认端口和安装目标 三.选择【Spatial Extensions】 四.选择安装位置 五.选择安装组件 六.选择数据库和输入对应账号密码 七.安装完成

【Linux】进程的初步认识

进程的初步认识 基本概念描述进程task_struct-PCB的一种task_stuct内容分类 查看进程通过系统调用获取进程标识符 基本概念 要了解进程&#xff0c;首先我们要知道两点 我们可以同时启动多个程序&#xff0c;也就意味着我们可以将多个.exe文件加载到内存操作系统如何去管理这些…

C# CAD SelectionFilter下TypedValue数组

SelectionFilter是用于过滤AutoCAD实体的类&#xff0c;在AutoCAD中&#xff0c;可以使用它来选择具有特定属性的实体。构造SelectionFilter对象时&#xff0c;需要传入一个TypedValue数组&#xff0c;它用于定义选择规则。 在TypedValue数组中&#xff0c;每个元素表示一个选…

如何将视频转换为音频?10 个最佳视频音频文件转换器!

生活中最令人愉快的乐趣之一就是拍摄、编辑和分享视频。由于有如此多的设备能够捕捉视频&#xff0c;并且有如此多的分享视频的方式&#xff0c;有时音频旁白可能比图片更重要、更有启发性。更糟糕的是&#xff0c;您选择的视频可能无法在您的设备上播放。 在这种情况下&#…