当前位置: 首页 > news >正文

链表题目总结 -- 回文链表

目录

  • 一. 从中心开始找最大的回文字符串
    • 1. 思路简述
    • 2. 代码
    • 3. 总结
  • 二. 判断是否为回文字符串
    • 1. 思路简述
    • 2. 代码
    • 3.总结
  • 三. 判断是否是回文链表
    • 1. 思路简述
    • 2. 代码
    • 3. 总结
    • 4. 优化解法

一. 从中心开始找最大的回文字符串

  • 题目链接:没有。给定一个字符串s,从s的中心开始,寻找最大的回文字符串。
  • 函数名:public static String palindrome(String s, int left, int right) ;

1. 思路简述

  • 因为链表的节点如果是奇数,那么中心就是一个点;链表的节点数是偶数,中心就是两个点。所以要传入left和right两个参数变量。
  • 这里说一下substring,当中的索引和数组的下标不太一样,可以理解为这里的索引仅仅标志着存储空间的开始,索引之后才是真正的存储空间,看下图:
    在这里插入图片描述
  • 最后一次循环后,left = -1,right = 3,按照substring的原理,left+1就可以,right不用动。
    在这里插入图片描述

2. 代码

	public static String palindrome(String s, int left, int right){while(left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {left--;right++;}return s.substring(left + 1, right);}//主函数public static void main(String[] args) {Scanner sc = new Scanner(System.in);String s = sc.nextLine();int left, right;if(s.length() % 2 == 0) {right = s.length() / 2;left = right - 1;}else{left = right = s.length() / 2;}System.out.println("left" + left + "   right:" + right);System.out.println(palindrome(s,left,right));}

3. 总结

  • 主要还是substring这一块的原理搞清楚,索引只是标志着存储空间的开始,而不是真的已经存储了。

二. 判断是否为回文字符串

  • 题目链接:没有。给定一个字符串s,判断这个字符串是否为回文字符串。
  • 函数名:public static Boolean isPalindrome(String s) ;

1. 思路简述

  • 从两头开始,向里面比较。

2. 代码

public static boolean isPalindrome(String s){int left = 0;int right = s.length() - 1;while(left < right){if(s.charAt(left) == s.charAt(right)){left++;right--;}elsereturn false;}return true;
}

3.总结

  • 很简单,注意边界

三. 判断是否是回文链表

  • 题目链接:https://leetcode.cn/problems/palindrome-linked-list/

1. 思路简述

  • 运用递归的栈进行比较,树是链表的变形,是链表衍生出来的。

2. 代码

class Solution {public ListNode left = null; public boolean traverse(ListNode right){if(right == null)return true;boolean res = traverse(right.next) && (left.val == right.val);left = left.next;return res;}public boolean isPalindrome(ListNode head) {left = head;return traverse(left);}
}

3. 总结

  • 时间复杂度:o(n)
  • 空间复杂度:o(n),也可以直接调用api中的stack类来实现栈存储节点,然后判断。
  • 还有一种方法,是把链表装进数组,然后再用索引依次判断是否为回文链表,这里也需要申请n个单位的空间复杂度,所以空间复杂度也是o(n),博主这里就不实现了。

  • 太牛了,东哥这个思想:树是由链表衍生出来的,所以链表也可以前序、后序遍历。

  • 树的遍历

void traverse(TreeNode root) {// 前序遍历代码traverse(root.left);// 中序遍历代码traverse(root.right);// 后序遍历代码
}
  • 链表的遍历
void traverse(ListNode head) {// 前序遍历代码traverse(head.next);// 后序遍历代码
}
  • 这种遍历能干什么呢,其实可以实现链表的正序或者逆序输出,看下面:
//正序输出
public static void traverse(ListNode head) {if(head == null)return;// 前序遍历代码	System.out.println(head.val);traverse(head.next);// 后序遍历代码
}//逆序输出
public static void traverse(ListNode head) {if(head == null)return;// 前序遍历代码traverse(head.next);// 后序遍历代码System.out.println(head.val);
}

4. 优化解法

  • 这里所提到的优化,主要还是在空间复杂度上进行优化。
  • 使用双指针,返回链表中心节点,将后一半链表反转,再依次比较两个链表的值。
public static ListNode reverseList_iteration(ListNode head){ListNode pre, cur, nxt;pre = null; cur = head; nxt = head;while(cur != null){//标记后继指针nxt = cur.next;//反转cur.next = pre;//更新 cur、pre指针pre = cur;cur = nxt;}return pre;
}
public static Boolean ispalindrome(ListNode head){if(head == null)return true;ListNode fast, slow;fast = slow = head;while(fast != null && fast.next != null){slow = slow.next;fast = fast.next.next;}if(fast! != null)slow = slow.next;ListNode left = head;ListNode right = reverseList_iteration(slow.next);while(right != null){if(right.val == left.val){left = left.next;right = right.next;}else return false;}slow.next = reverseList_iteration(right);return true;
}

为什么有这一行呢?( if(fast! != null) slow = slow.next;),看下图:很显然,当链表数目为奇数的时候,slow指针并没有指到对应的位置,只有向后再走一步,链表反转才有意义。
在这里插入图片描述
这个程序执行完之后,虽然运行成功,但是链表结构发生了改变,如下图:
在这里插入图片描述
如果想要保证链表结构不变 ,救灾输出的时候把链表还原出来,也就是这里东哥所说的q为头节点的链表反转之后,用p指针将它们连起来,如下图:
在这里插入图片描述
如果引入p,q指针显然又要申请额外的内存空间,不划算,我们在原来程序的基础上做一个改进,看下面的代码:

public boolean isPalindrome(ListNode head) {ListNode fast, slow;fast = slow = head;//这样就保证不管是奇数还是偶数的链表,slow指针都差一个才到位置,也就是p指针指的地方while(fast.next != null && fast.next.next != null){slow = slow.next;fast = fast.next.next;}ListNode left = head;//而right指针正好就是q指针指的地方,这样就完美的解决了不额外申请空间的问题ListNode right = reverseList_iteration(slow.next);while(right != null){if(right.val == left.val){left = left.next;right = right.next;}else return false;}slow.next = reverseList_iteration(right);return true;
  • 时间复杂度:o(n)
  • 空间复杂度:o(1)

参考:
https://labuladong.github.io/algo/di-yi-zhan-da78c/shou-ba-sh-8f30d/ru-he-pan–f9d3c/
https://leetcode.cn/problems/palindrome-linked-list/solution/hui-wen-lian-biao-by-leetcode-solution/

相关文章:

链表题目总结 -- 回文链表

目录一. 从中心开始找最大的回文字符串1. 思路简述2. 代码3. 总结二. 判断是否为回文字符串1. 思路简述2. 代码3.总结三. 判断是否是回文链表1. 思路简述2. 代码3. 总结4. 优化解法一. 从中心开始找最大的回文字符串 题目链接&#xff1a;没有。给定一个字符串s&#xff0c;从…...

JAVA集合之List >> Arraylist/LinkedList/Vector结构

在Java开发过程中&#xff0c;可能经常会使用到List作为集合来使用&#xff0c;List是一个接口承于Collection的接口&#xff0c;表示着有序的列表。而我们要讨论的是它下面的实现类Arraylist/LinkedList/Vector的数据结构及区别。 ArrayList ArrayList&#xff1a;底层为数组…...

Linux多进程开发

一、进程概述 1、程序和进程 程序是包含一系列信息的文件&#xff0c;这些信息描述了如何在运行时创建一个进程&#xff1a; 二进制格式标识&#xff1a;每个程序文件都包含用于描述可执行文件格式的元信息。内核利用此信息来解释文件中的其他信息。&#xff08;ELF可执行连…...

三维重建小有基础入门之特征点检测基础

前言&#xff1a;本文将从此篇开始&#xff0c;记录自己从普通CVer入门三维重建的学习过程&#xff0c;可能过程比较坎坷&#xff0c;都在摸索阶段&#xff0c;但争取每次学习都能进一步&#xff0c;提高自己的能力&#xff0c;同时&#xff0c;每篇文章都会按情况相应地推出B站…...

基于node.js+vue+mysql考研辅导学习打卡交流网站系统vscode

语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 主要功能包括管理员&#xff1a;首页、个人中心、用户管理、每日打卡管理、考研学校管理、考研专业管理、直通车管理、学习教材管理、…...

【C++、数据结构】封装unordered_map和unordered_set(用哈希桶实现)

文章目录&#x1f4d6; 前言1. 复用同一个哈希桶⚡1.1 &#x1f300;修改后结点的定义1.2 &#x1f300;两个容器各自模板参数类型&#xff1a;2. 改造之后的哈希桶⛳3. 哈希桶的迭代器&#x1f525;3.1 &#x1f4a5;哈希桶的begin&#xff08;&#xff09;和 end&#xff08;…...

StratoVirt 的 vCPU 拓扑(SMP)

CPU 拓扑用来表示 CPU 在硬件层面的组合方式&#xff0c;本文主要讲解 CPU 拓扑中的 SMP&#xff08;Symmetric Multi-Processor&#xff0c;对称多处理器系统&#xff09;架构&#xff0c;CPU 拓扑还包括其他信息&#xff0c;比如&#xff1a;cache 等&#xff0c;这些部分会在…...

现在直播大部分都是RTMP RTMP VS RTC

一 RTMP 抓了下抖音直播的包&#xff0c;windows端&#xff0c;走的TCP&#xff0c;加密了&#xff0c;估计还是RTMP。 我以为直播带货&#xff0c;都是RTC了。 快手直播也是TCP&#xff0c;地址用了IPV6。 淘宝直播也是。现在大部分直播都是RTMP。 只有视频会议走的RTC。…...

【Unity实战100例】Unity循环UI界面切换卡片功能

目录 ​编辑 一:制作UI界面 二:代码逻辑 1.定义基础变量...

Monorepo or 物料市场?结合工作实际情况对公司现有前端体系的思考

前言 去年年中基于若依vue前端框架进行了改造&#xff0c;加上后端的配合&#xff0c;我写了一套脚手架和项目中后台模板。中后台模板中包含了许多基础代码&#xff0c;比如登录/注册、路由、权限等等相关功能。这个中后台模板是基于我们实际开发定制的&#xff0c;所以跟通用…...

GEE学习笔记八十八:在自己的APP中使用绘制矢量(上)

在GEE中尤其是自己的APP中调用绘制的矢量图形方法之前没有合适的方法&#xff0c;但是现在可以通过ui.Map.DrawingTools(...)以及ui.Map.GeometryLayer(...)结合来做。具体的API如下图&#xff1a; 在这一篇中我先通过一个简单的例子来展示一下使用这些API后可以实现什么效果&a…...

“笨办法”学Python 3 ——练习 39. 字典,可爱的字典

练习39 源代码 # create a mapping of state to abbreviation #创建一个州与缩写的映射 states {Oregon:OR,Florida:FL,California: CA, New York: NY,Michigan:MI} #创建一个字典&#xff0c;key为州名&#xff0c;value为州缩写#Create a basic set of states and some cit…...

模糊的照片如何修复清晰?

相信有很多人用手机拍照时&#xff0c;觉得拍出来的照片一定是很漂亮的&#xff0c;结果拍了之后&#xff0c;拿出来一看模糊一片&#xff0c;根本看不清是什么。或者是只显示一半另一半模糊一片。而这些精彩瞬间很多时候是无法重拍的。虽然谁也不想拍出的照片出现模糊&#xf…...

如何理解​session、cookie、token的区别与联系?

session、cookie、token。 相信学过接口的朋友都特别熟悉了。 但是对我一个刚接触接口测试的小白来说&#xff0c;属实有点分不清楚。 下文就是我通过查阅各种资料总结出来的一点理解&#xff0c;不准确的地方还请各位指正。 &#xff08;文末送洗浴中心流程指南&#xff09…...

【MyBatis】| MyBatis分页插件PageHelper

目录 一&#xff1a;MyBatis使⽤PageHelper 1. limit分⻚ 2. PageHelper插件 一&#xff1a;MyBatis使⽤PageHelper 1. limit分⻚ &#xff08;1&#xff09;概念&#xff1a; ①页码&#xff1a;pageNum&#xff08;用户会发送请求&#xff0c;携带页码pageNum给服务器&am…...

Java枚举类详解

一、定义格式 public enum s { 枚举项1,枚举项2,枚举项3; } // 定义一个枚举类&#xff0c;用来表示春&#xff0c;夏&#xff0c;秋&#xff0c;冬这四个固定值 public enum Season {SPRING,SUMMER,AUTUMN,WINTER; } 二、枚举的特点 1、所有枚举类都是Enum的子类 2、我们可以通…...

C语言数组

一.数组定义 数组由数据类型相同的一系列元素组成 如 int main(){ float candy[365]; char code[12]; int states[50]; … } cnady是包含了365个float元素的数组。code是包含了12个char类型的数组。states包含了50个int类型的数组。 二.数组初始化和取值 我们使用花括号包含值&…...

Scala 入门(第一章Scala 环境搭建、插件的安装)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 第 1 章 Scala 入门1.1 概述1.1.1 为什么学习 Scala1.1.2 Scala 发展历史1.1.3 Scala 和 Java 关系1.1.4 Scala 语言特点1.2 Scala 环境搭建1.3 Scala 插件安装1.4 HelloWorl…...

math@多项式@求和式乘法@代数学基本定理

文章目录多项式求和式乘法应用代数学基本定理相关证明高次方程其他关于多项式的参考多项式求和式乘法 S∏j1(∑k1ajk)⁣ ⁣ ⁣j∏j1m(∑k1njajk)⁣ ⁣ ⁣jS\prod_{j1}\left(\sum\limits_{k1}a_{jk}\right)_{\!\!\!j} \\\prod_{j1}^{m}\left(\sum\limits_{k1}^{n_j}a_{jk}\r…...

Kafka系列之:基于SCRAM和Ranger机制完成动态新增kafka读写账号、赋予账号对指定Topic的读写权限

Kafka系列之:基于SCRAM和Ranger机制完成动态新增kafka读写账号、赋予账号对指定Topic的读写权限 一、需求背景二、添加写用户三、查看用户是否添加到zookeeper中四、查看用户五、赋予用户topic写权限六、生产者配置文件七、ranger给用户权限八、往Topic写数据九、删除添加的用…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...