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

文章目录

  • 🌏引言
  • 🧭[链表的回文结构](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.rhkb.cn/news/98052.html

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

相关文章

简单认识Docker数据管理

文章目录 为何需要docker数据管理数据管理类型 一、数据卷二、数据卷容器三、容器互联 为何需要docker数据管理 因为数据写入后如果停止了容器,再开启数据就会消失,使用数据管理的数据卷挂载,实现了数据的持久化,重启数据还会存在…

分布式websocket解决方案

1、websocket问题由来 websocket基础请自行学习,本文章是解决在分布式环境下websocket通讯问题。 在单体环境下,所有web客户端都是连接到某一个微服务上,这样消息都是到达统一服务端,并且也是由一个服务端进行响应,所以不会出现问题。 但是在分布式环境下,我们很容易发现…

自我管理篇--“90%的简历会被刷掉”这个现象背后的原因

以上简历模板资源的排版可能不是最优,但工作经历可以借鉴 文章目录 一、简历问题出在什么地方二、如何提升简历的质量三、如何避免常见的简历错误四、如何让你的简历脱颖而出五、如何准备面试 为什么90%的简历会被淘汰 在当今竞争激烈的就业市场中,求职者…

JavaScript(JavaEE初阶系列13)

目录 前言: 1.初识JavaScript 2.JavaScript的书写形式 2.1行内式 2.2内嵌式 2.3外部式 2.4注释 2.5输入输出 3.语法 3.1变量的使用 3.2基本数据类型 3.3运算符 3.4条件语句 3.5循环语句 3.6数组 3.7函数 3.8对象 3.8.1 对象的创建 4.案例演示 4…

python采集京东商品详情页面数据,京东API接口,京东h5st签名(2023.08.20)

一、原理与分析 1、目标页面 https://item.jd.com/6515029.html 在chrome中打开,按f12键进入开发者模式,找到商品详情数据接口,如下: 2、URL链接: https://api.m.jd.com/?appidpc-item-soa&functionIdpc_detail…

学习笔记整理-面向对象-03-构造函数

一、构造函数 1. 用new调用函数的四步走 new 函数();JS规定,使用new操作符调用函数会进行"四步走": 函数体内会自动创建出一个空白对象函数的上下文(this)会指向这个对象函数体内的语句会执行函数会自动返回上下文对象,即使函数没…

通过Git使用GitHub

目录 一、建立个人仓库 二、配置SSH密钥 三、克隆仓库代码 四、推送代码到个人仓库 五、代码拉取 一、建立个人仓库 1.建立GitHub个人仓库,首先注册GitHub用户。注册好了之后,打开用户的界面 然后就是配置问题 配置好后拉到最下方点击create repos…

数据结构 | 堆

本文简要总结堆的概念。 更新:2023 / 8 / 20 数据结构 | 堆 堆概念方法插入步骤 删除步骤 示例大根堆堆插入删除堆排序 代码实现Python大根堆1.2. heapq 小根堆1.2. heapq 参考链接 堆 概念 如果谈到堆排序,那么必然要说说什么是 大根堆 max heap 和 …

redis--主从复制

redis主从复制 Redis 主从复制是一种用于实现数据复制和数据备份的机制,它允许将一个 Redis 服务器的数据复制到其他 Redis 服务器上。主从复制在 Redis 中通常用于构建高可用性架构、读写分离以及数据分析等场景。 主从复制的角色 主服务器(Master&a…

【AI视频教程】只需5步,AI作出鸡你太美视频

1.视频效果 黄昏见证虔诚的信徒 2.准备工作 制作视频效果,需要准备下面3个条件: 准备stable diffusion的环境剪辑一段【鸡你太美】原版视频stable diffusion安装sd-webui-IS-NET-pro插件 2.1部署stable diffusion环境 部署步骤参考制作ikun图片的文章…

laravel框架中批量更新数据

在php框架中 tp中就有批量更新封装好的 SaveAll 在laravel中有批量插入没有批量更新操作;因此我们可以自己去封装一个 然后批量进行更新操作 封装参考代码: /*** 批量更新** param $tableName 表名称* param string $pk 更新的字段* param array $multipleData 要更新的数据*…

redis事务对比Lua脚本区别是什么

redis官方对于lua脚本的解释:Redis使用同一个Lua解释器来执行所有命令,同时,Redis保证以一种原子性的方式来执行脚本:当lua脚本在执行的时候,不会有其他脚本和命令同时执行,这种语义类似于 MULTI/EXEC。从别…

攻防世界-PHP2

原题 解题思路 这题需要查看页面的phps文件(这玩意从没见过)。phps的文件是存放php的源代码的,但是不是所有网站都有。 只要让传入的idadmin就可以得到key了。 但是直接传入admin不行。用burp编码。 结果还是不行: 那就再…

Windows安装 Elasticsearch 教程

下载地址 Past Releases of Elastic Stack Software | Elastic 解压 解压完的样子 进入BIN目录 D:\Develop\elasticsearch\elasticsearch-7.12.0\bin 按住shift 鼠标右键 打开 powershell 窗口 查看ES版本 .\elasticsearch.bat --version 出现问题了 警告:不赞成…

excel逻辑函数篇1

1、AND(logical1,[logical2],…):用于测试所有条件是否均为TRUE 检查所有参数均为true,如果是则返回true 2、OR(logical1,[logical2],…):用于测试是否有为TRUE的条件 如果任意参数值为true,即返回true;只有当所有参数…

视频云存储/安防监控/视频汇聚EasyCVR平台新增经纬度选取功能

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、…

绘制原型图的常用工具之墨刀

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于OA项目的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.墨刀是什么 二.墨刀的作用 三.墨刀界…

react-native-webview使用postMessage后H5不能监听问题(iOS和安卓的兼容问题)

/* 监听rn消息 */ const eventListener nativeEvent > {//解析数据actionType、extraconst {actionType, extra} nativeEvent.data && JSON.parse(nativeEvent.data) || {} } //安卓用document,ios用window window.addEventListener(message, eventLis…

微信小程序胶囊位置计算,避开胶囊位置

由于小程序在不同的手机上顶部布局会发生变化,不能正确避开胶囊位置,所以通过官方给出的胶囊信息,可以计算出胶囊位置,并避开 图示例: 此处思路是,获取胶囊底部位置,并拉开10个px 计算出来的…

Maven方式构建SpringBoot项目

目录 1、创建maven项目 2、添加springboot相关依赖 3、配置启动端口 4、修改APP文件 5、配置controller 6、启动应用 1、创建maven项目 项目如下&#xff1a; 2、添加springboot相关依赖 <parent><groupId>org.springframework.boot</groupId><arti…