图解LeetCode——234. 回文链表

news2024/12/23 22:16:48

一、题目

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

二、示例

2.1> 示例 1:

输入】head = [1,2,2,1]
输出】true

2.2> 示例 2:

输入】head = [1,2]
输出】false

提示:

  • 链表中节点数目在范围[1, 10^5]
  • 0 <= Node.val <= 9

进阶:

你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

三、解题思路

3.1> 思路1:转存+双指针

根据题目描述,我们需要判断链表是否是回文链表,那么比较容易想到的一种解题方式就是,我们创建一个额外的数组结构,从头节点开始遍历链表,并将其存储到数组结构中。但是对于链表结构来说,只有遍历到最后一个链表,才可以知道整个链表的长度,那么,我们就选择ArrayList来进行额外数据的存储。

在对比过程中,我们通过双指针的方式,分别从首、尾两个位置开始,依次向中心靠拢对比,当方向不同,则表示不是回文链表,否则就是回文链表了。

3.2> 思路2:倒转链表

除了上面的解题方式之外,我们也可以探究一下是否能实现 O(1) 空间复杂度解决此题。那么,由于ListNode单向链表结构,所以只能向一个方向移动,所以为了能够改变遍历方式的话,就可以通过改变next的值来倒转链表。

那么我们就可以将整个链表的一半倒转一下,即:将A——>B倒转为A<——B;那么我们就可以从链表的“中心点”作为开始,分别向两侧进行遍历&对比。那么为题来了,怎么知道那个位置是整个链表的“中心点”呢?此处我们就可以采用快慢指针的方式,即:

慢指针】一次移动一步,即:slow = slow.next
快指针】一次移动两步,即:fast = fast.next.next;

那么当快指针遍历到末尾之后,慢指针就处于了“中心点”范围内了。不过此处还有奇偶数的特殊处理:

偶数长度链表】slow会处于中心点范围(两个节点)中的右侧节点位置;
奇数长度链表】slow会处于中心点位置。

具体操作方式,请见下图所示:

四、代码实现

4.1> 实现1:转存+双指针

class Solution {
    public boolean isPalindrome(ListNode head) {
        List<ListNode> list = new ArrayList();
        while(head != null) {
            list.add(head);
            head = head.next;
        }
        for (int i = 0; i < list.size()/2; i++) 
            if (list.get(i).val != list.get(list.size() - i - 1).val) 
                return false;
        return true;
    }
}

4.2> 实现2:倒转链表

class Solution {
    public boolean isPalindrome(ListNode head) {
        ListNode slow = head, fast = head, pre = null;
        while(fast != null && fast.next != null) {
            ListNode temp = slow.next;
            if (pre != null) slow.next = pre;
            pre = slow;
            slow = temp;
            fast = fast.next.next;
        }
        if (fast != null) slow = slow.next; // 偶数节点
        while (slow != null) {
            if (pre.val != slow.val) return false;
            pre = pre.next;
            slow = slow.next;
        }
        return true;
    }
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

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

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

相关文章

[Android Studio Tool]在Android Studio项目中如何使用CSV文件

文章目录 在Android Studio项目中如何使用CSV文件1. 前情提要&#xff1a;CSV文件的准备2. CSV文件在安卓项目一般存放在什么位置&#xff1f;3. Android Studio处理CSV文件的常用插件&#xff1f;4. 怎么调整Android Studio中对GBK编码的CSV文件的处理&#xff1f;以下是一个代…

就业内推 | 国企招运维工程师,红帽认证、华为认证优先

01 厦门中盾安信科技有限公司 &#x1f537;招聘岗位&#xff1a;应用运维工程师&#xff08;中级&#xff09; &#x1f537;职责描述&#xff1a; 1、负责平台应用系统的安装、配置、日常巡检、维护、故障的处理&#xff1b; 2、负责平台服务相关应用的部署、配置、日常巡检…

Java面试知识点(全)- Java IO知识点详细

Java面试知识点(全) 导航&#xff1a; https://nanxiang.blog.csdn.net/article/details/130640392 注&#xff1a;随时更新 从数据传输方式理解IO流 从数据传输方式或者说是运输方式角度看&#xff0c;可以将 IO 类分为: 字节流, 字节流读取单个字节&#xff0c;字符流读取单…

mock模拟数据 ,UmiJS构建项目

Mock是一个用于模拟数据的JavaScript库&#xff0c;可以根据需要生成各种数据类型的模拟数据&#xff0c;可以配合json server使用 并且可以使用拦截ajax请求来模拟后端API接口。 JSON Server则是一个使用JSON文件来模拟RESTful API的工具 > 默认安装到运行环境&#xff1…

MYSQL索引、事务、存储引擎

一、索引 索引是一个排序的列表&#xff0c;包含字段的值和相应的行数据的物理地址 作用&#xff1a;加快表的查询速度&#xff0c;可以对字段排序 如何实现&#xff1a;没有索引的情况&#xff0c;要查询某行数据&#xff0c;需要先扫描全表来定位某行数据。有索引后会通过…

java ThreadLocal

private ThreadLocal threadLocal new ThreadLocal(); threadLocal.set(0); (int) threadLocal.get(); 上面三行代码分别是定义、赋值和取值。 介绍&#xff1a; 我们只需要实例化对象一次&#xff0c;并且也不需要知道它是被哪个线程实例化。虽然所有的线程都能访问到这个T…

【Vue】学习笔记-Vue CLI $nextTick 过渡与动画

$nextTick 这是一个生命周期钩子 this.$nextTick(回调函数) 在下一次DOM更新结束后执行其指定的回调 什么时候用&#xff1a;当数据改变后&#xff0c;要基于更新后的新DOM进行某些操作时&#xff0c;要在nextTick所指定的回调函数中执行。 使用$nextTick优化Todo-List src/co…

winform-SunnyUI控件解决大小位置变化

文章目录 前言问题种类使用SunnyUI解决控件DPI问题&#xff08;分辨率问题&#xff09;1.添加配置文件app.manifest2.将配置文件中dpiAware打开3.添加uiStyleManager1控件并将控件中DPIScale设置为true4.效果图 使用FlowLayOutPanel解决控件边距问题1.问题样式2.使用FlowLayOut…

Grafana系列-统一展示-12-RED Method Dashboard

系列文章 Grafana 系列文章 概述 目前关于监控指标, 主流的有 3 个方法(Method): RED : Rate&#xff08;访问速率&#xff09;, Errors&#xff08;错误&#xff09;, Duration&#xff08;响应时长&#xff09; - 由 tom_wilkie 引入USE : Utilization&#xff08;利用率…

TEMPUS FUGIT: 2

环境准备 靶机链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;5i9p 虚拟机网络链接模式&#xff1a;桥接模式 攻击机系统&#xff1a;kali linux 2022.03 信息收集 1.对靶机进行端口和服务的扫描 nmap -sV -p- -A 10.10.10.130 可以看到22端口是关闭的 2.用…

线段树-哈工大数据结构与算法作业

title: 线段树-哈工大作业 date: 2023-05-16 11:42:26 tags: 数据结构与算法 线段树 问题&#xff1a; 区间查询求和问题:给定一个含有n个整数序列的数组A&#xff0c;查询任意区间最大值与区间和的复杂度为O(n)&#xff0c;若进行m次查询&#xff0c;则总的复杂度为O(mn)。…

深析AutosarNM 网络管理

深析AutosarNM 网络管理 深析AutosarNM 网络管理1. AutosarNM 网络管理相关的专业术语2. 各种模式下的各种状态下&#xff0c;报文的收发情况汇总如下表&#xff1a;3. AutosarNM网络管理使用的时间参数&#xff1a;4. AutosarNM网络管理唤醒请求(Wake Up Request)5. ​​​​​…

MySQL 5.7数据库下载与安装教程

说明&#xff1a; 安装环境:Win10 64位 软件版本:MySQL 5.7.35 解压版 一.下载 点击下载地址&#xff1a; MySQL :: Download MySQL Community Server (Archived Versions) https://downloads.mysql.com/archives/community/ 选择合适的版本下载 绿色框框 是正式版&#xff0…

第02讲:SpringCloudStream

一、什么是SpringCloudStream SpringCloudStream是SpringCloud的一个子项目&#xff0c;他提供了一套更加通用的操作MQ的解决方案 Destination Binder&#xff08;目标绑定器&#xff09; &#xff1a;微服务与消息中间件通信的组件Destination Bindings&#xff08;目标绑定&…

2023爱分析・云原生 IDE 市场厂商评估报告-行云创新(CloudToGo)

1. 研究范围定义 企业数字化转型初期&#xff0c;通过资源池云化&#xff0c;解决了IDC时代运维、部署、扩容的难题&#xff0c;但传统应用单体架构厚重、烟囱式架构等带来的一系列应用层面的问题并没有得到有效解决&#xff0c;云对业务的价值主要还停留在资源供给的阶段…

Scaled dot-prodect Attention的原理和实现(附源码)

文章目录 背景什么是AttentionAttention权重的计算方法1. 多层感知机法2. Bilinear方法3. Dot Product4. Scaled Dot Product Scaled dot-prodect Attention的源码实现 背景 要了解深度学习中的Attention&#xff0c;就不得不先谈Encoder-Decoder框架&#xff08;sequence to s…

拍立淘API接口说明文档 按图搜索淘宝商品API 实时数据返回

开发背景&#xff1a; 随着电商行业的不断发展&#xff0c;人们的购物需求日益增多。在购买商品时&#xff0c;很多人会通过搜索引擎、社交媒体等手段来获取信息或灵感。但是&#xff0c;在这些渠道中找到想要的商品并不容易&#xff0c;因为其中可能会混杂着一些广告或无关内…

Android内存优化检测工具LeakCanary使用

一、什么是LeakCanary leakCanary是Square开源框架&#xff0c;是一个Android和Java的内存泄露检测库。如果检测到某个activity有内存泄露&#xff0c;LeakCanary就是自动地显示一个通知&#xff0c;所以可以把它理解为傻瓜式的内存泄露检测工具。通过它可以大幅度减少开发中遇…

Java 并发队列详解

一&#xff0c;简介 1&#xff0c;并发队列两种实现 以ConcurrentLinkedQueue为代表的高性能非阻塞队列以BlockingQueue接口为代表的阻塞队列 2&#xff0c;阻塞队列与非阻塞队列的区别 当阻塞队列是空的时&#xff0c;从队列中获取元素的操作将会被阻塞&#xff0c;试图从…

【BFS】华子20230506笔试第三题(动态迷宫问题)Java实现

文章目录 题目链接思路BFS板子我的解答 题目链接 塔子哥的codeFun2000&#xff1a;http://101.43.147.120/p/P1251 测试样例1 输入 3 2 1 0 1 2 2 1 2 0 100 100 100 100 000 100 000 000 001输出 1测试样例2 输入 3 2 1 0 2 0 0 1 2 2 000 000 001 010 101 101 110 010 …