【数据结构】链表的回文结构

news2024/11/24 6:48:21

文章目录

  • 🌏引言
  • 🧭[链表的回文结构](https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId=49&&tqId=29370&rp=1&ru=/activity/oj&qru=/ta/2016test/question-ranking)
    • 🚩🚩题目描述:
    • 🚩🚩示例:
    • 🚩🚩思路解析:
      • 🚩🚩🚩寻找中间节点
      • 🚩🚩🚩局部翻转
      • 🚩🚩🚩判断是否回文
    • 🚩🚩完整代码与注意事项
      • 🚩🚩🚩注意事项:
      • 🚩🚩🚩完整代码
  • ⭕总结

🌏引言

单链表的操作算法是笔试面试中较为常见的题目。
本文将着重介绍平时面试中常见的关于链表的应用题目,马上要进行秋招了。希望对你们有帮助 _😀
在这里插入图片描述

🧭链表的回文结构

在这里插入图片描述

🚩🚩题目描述:

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class PalindromeList {
    public boolean chkPalindrome(ListNode A) {
         // write code here
    }
}

🚩🚩示例:

给定链表:11->22->33->22->11
返回值:true

🚩🚩思路解析:

回文字符串的中间节点两边的元素,如果从两头两中间进行比对的话,每一个里面的元素完全相同
在这里插入图片描述

🚩🚩🚩寻找中间节点

我们先寻找到中间节点,然后将中间节点后的链表部分进行局部偏转

寻找中间节点时用我们快慢指针的思想

fast:快指针,一次走两步
slow:慢指针,一次走一步
结束条件:
链表元素个数为偶数时:fast.next == null;
链表元素个数为奇数时:fast == null;
在这里插入图片描述

寻找中间节点代码如下

ListNode fast = A;
        ListNode slow = A;
        //找中间节点
        while(fast != null||fast.next != null) {
            //快指针,一次走两步
            fast = fast.next.next;
            //慢指针,一次走一步
            slow = slow.next;
        }

🚩🚩🚩局部翻转

接下来我们要对局部进行翻转

翻转单链表,我们首先设一个cur节点为我们当前所需要翻转的节点;还有一个curNext记录cur下一节点

翻转时:

  • 先用curNext记录cur下一节点的位置
  • 然后将cur.next置为slow,让cur节点指向slow
  • 再将cur节点设为slow
  • 最后让cur置为curNext,进行下一节点的翻转
    在这里插入图片描述
    结束条件:cur == null;

代码实现如下

  ListNode cur = slow.next;
        //局部翻转
        while( cur != null) {
            ListNode curNext = cur.next;
            cur.next = slow;
            slow = cur;
            cur = curNext;
        }

🚩🚩🚩判断是否回文

接下来我们就要判断是否回文

判断思想:

  • A节点与slow节点同时向中间节点进行遍历
  • 对比其中元素是否相等
  • 不相等返回false,相等则继续遍历,直到结束

结束条件:

  • 当链表中节点数为奇数时,这时候A与slow会相遇,指向同一位置
  • 所以条件为A == slow;
  • 在这里插入图片描述
  • 当链表中节点为偶数时,这时候A与slow是不会相遇的
  • 但是如果两边都遍历完,A的下一节点指向的肯定是slow
  • 所以条件为A.next == slow;
  • 在这里插入图片描述

代码实现如下:

//判断是否回文
        while(slow != A&& A.next != slow) {
            if(slow.val != A.val) {
                return false;
            }
            slow = slow.next;
            A = A.next;
        }
        return true;

🚩🚩完整代码与注意事项

🚩🚩🚩注意事项:

  • 结束条件不是循环的条件,不要搞混,不然进不去循环😭
  • 要注意对传进来的数据进行判断与筛选

🚩🚩🚩完整代码

import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class PalindromeList {
    public boolean chkPalindrome(ListNode A) {
        
        ListNode fast = A;
        ListNode slow = A;
        //找中间节点
        while(fast != null&&fast.next != null) {
            //快指针,一次走两步
            fast = fast.next.next;
            //慢指针,一次走一步
            slow = slow.next;
        }
        ListNode cur = slow.next;
        //局部翻转
        while( cur != null) {
            ListNode curNext = cur.next;
            cur.next = slow;
            slow = cur;
            cur = curNext;
        }
        //判断是否回文
        while(slow != A&& A.next != slow) {
            if(slow.val != A.val) {
                return false;
            }
            slow = slow.next;
            A = A.next;
        }
        return true;
    }
}

⭕总结

关于《【数据结构】链表的回文结构》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

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

相关文章

学习网络编程No.3【socket理论实战】

引言: 北京时间:2023/8/12/15:32,自前天晚上更新完文章,看了一下鹅厂新出的《扫毒3》摆烂至现在,不知道是长大了,还是近年港片就那样,给我的感觉不是很好,也可能是国内市场对港片不…

XXL-JOB任务调度中心后台命令执行漏洞

漏洞描述 XXL-JOB任务调度中心后台存在命令执行漏洞,攻击者可在后台通过写入shell命令任务调度获取服务器控制权限 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权…

AndroidAGP8.1.0和JDK 17迁移之旅

AndroidAGP8.1.0和JDK 17迁移之旅 前言: 由于我最近写demo的直接把之前的项目从AGP4.2.2升级到8.1.0引发了一些列问题,这里记录一下,前面讲解过迁移DSL方式遇到的问题,这次升级8.1.0也比之前顺利多了,想看DSL迁移的可…

Edge浏览器免费使用GPT3.5

搜索sider,安装Sidebar插件 注册账号即可每天免费使用30次。 Sider: ChatGPT侧边栏,GPT-4, 联网, 绘图

Excel VBA 复制除指定工作表外所有的工作表的内容到一张工作表中

当我们有一张表里面有很多sheet 具有相同的表结构,如果需要汇总到一张表中,那么我们可以借助VBA 去实现汇总自动化 Sub 复制所有工作表内容()Dim ws As WorksheetDim targetSheet As WorksheetDim lastRow As Long 设置目标表格,即要将所有…

SpringMVC之@RequestMapping注解

文章目录 前言一、RequestMapping介绍二、详解(末尾附源码,自行测试)1.RequestMapping注解的位置2.RequestMapping注解的value属性3.RequestMapping注解的method属性4.RequestMapping注解的params属性(了解)5.RequestM…

课程项目设计--项目建立--宿舍管理系统--springboot后端

前要 项目设计–宿舍管理系统 文章目录 项目建立导入依赖配置文件配置目录结构config配置mybatis-plusswagger 生成实体、mapper和servicebaseEntity统一响应实例响应码接口响应码接口实现统一响应result统一分页响应 项目建立 太长了,修改一下 导入依赖 暂时先加…

Java 项目日志实例:Log4j2

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~ Apache Log4j 2 是对 Log4j 的升级,与其前身 Log4j 1.x 相比有了显着的改进,并提供了许多 Logback 可用的改进,同时支持 JCL 以及 SLF4J…

Word中对象方法(Methods)的理解及示例(上)

【分享成果,随喜正能量】奋斗没有终点,任何时候都是一个起点,沉潜是为了蓄势待发,沉潜是为了等待因缘。鲸豚沉潜于大海,幽兰深藏于山谷,能够经得起沉潜的人,才会有更高的成就。正如一年的树木只能当柴烧&am…

C++入门:函数缺省参数与函数重载

目录 1.函数缺省参数 1.1 缺省参数概念 1.2 缺省参数分类 2.函数重载 2.1 函数重载概念 2.2 C支持函数重载的原理 1.函数缺省参数 1.1 缺省参数概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实 参则采用该形参的…

Unity 之 RaycastHit(存储射线投射操作)

文章目录 总述具体使用场景 总述 RaycastHit 类是 Unity 中的一个结构,用于存储射线投射操作的结果。射线投射是一种常用的技术,用于检测场景中的碰撞、获取碰撞点、获取碰撞对象的信息等。RaycastHit 提供了关于射线与场景中对象的交互信息&#xff0c…

新型Windows内核池风水利用工具研究

引用 这篇文章的目的是介绍一种新型基于内核态分页内存和非分页内存的越界写入通用利用技术和相关工具复现. 文章目录 引用简介分页模式利用分析分页模式利用调试分析非分页模式利用分析非分页模式利用调试分析工具使用方法工具使用效果相关引用参与贡献 简介 笔者的在原作者利…

硕士研究生小论文写作方法

本人985硕博毕业-曾多次辅导本硕同学完成成毕设,下面分享一些经验 图为当年大论文外审结果!!! 当撰写一篇硕士研究生的小论文时,以下是每个部分的写作方法的详细描述,: 摘要(Abst…

零基础在家就可以做的副业,3个兼职项目推荐

做副业最需要注重的是什么?我觉得有收益,稳定,上手快,可以学到东西,下面3个副业适合新手快速变现的副业,大可以随便挑一两个尝试一下 第一个:在小红书的发手记 满5000粉丝们就可以申请品牌合作…

OMT画图的五种结构表达方式

实例化:A类依赖于B类。 class B {doSth () {} }class A {constructor () {}run () {const b new B()b.doSth()} }new A().run()委托:A对象依赖于B对象。 class B {doSth () {} } const b new B()class A {constructor () {}run () {b.doSth()} } new A…

为什么 Lemon8 是今年值得关注的社交媒体应用?

社交媒体应用逐渐成为了用户联系亲朋好友的一种方式,也成为了营销推广有利的平台。近期,Lemon8也快速崛起,一度荣登美国APP下载排行榜前十名,在社交和电子商务市场中,也占据了很大的份额,在日本以及泰国多地更为流行。为什么Lemon8会成为最值得关注的社交媒体应用呢? 什么原因…

基于springboot+vue的博物馆藏品平台(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

TouchGFX之安装

1.安装X-CUBE-TOUCHGFX​ 帮助 ->管理嵌入式软件包 转到“STMicroelectronics”选项卡。 滚动直至找到“X-CUBE-TOUCHGFX”,然后展开节点。 点击“TouchGFX Generator”复选框,然后点击“立即安装”。 将下载软件包并显示许可协议。 找到TouchGFX Gen…

(成功踩坑)electron-builder打包过程中报错

目录 注意:文中的解决方法2,一定全部看完,再进行操作,有坑 背景 报错1: 报错2: 1.原因:网络连接失败 2.解决方法1: 3.解决方法2: 3.1查看缺少什么资源文件 3.2去淘…

PostgreSQL基本操作总结

安装按PostgreSQL数据库后,会默认创建用户postgres和数据库postgres,这个用户是超级用户,权限最高,可以创建其他用户和权限,在实际开发过程中,会新创建用户和业务数据库,本文主要介绍用户权限和…