【LeetCode 热题 100】234. 回文链表——快慢指针+反转链表

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

文章目录

  • 整体思路
  • 完整代码
  • 时空复杂度
    • 时间复杂度:O(N)
    • 空间复杂度:O(1)

整体思路

这段代码旨在解决一个经典的链表问题:回文链表 (Palindrome Linked List)。问题要求判断一个单链表是否是回文结构,即从前向后读和从后向前读的序列是否相同。例如 1 -> 2 -> 3 -> 2 -> 1 是回文链表。

该算法采用了一种非常高效且空间优化的 “快慢指针 + 反转后半部分 + 比较” 的三步走策略。它避免了使用额外数组存储所有节点,从而实现了 O(1) 的空间复杂度。

  1. 第一步:使用快慢指针找到链表的中点

    • 算法初始化两个指针 slowfast,都指向链表的头节点 head
    • 通过一个 while 循环,让 fast 指针每次移动两步,slow 指针每次移动一步。
    • 这个循环的终止条件是 fast 到达或越过链表的末尾。当循环结束时:
      • 如果链表长度为奇数,slow 指针会恰好停在链表的正中间节点。
      • 如果链表长度为偶数,slow 指针会停在后半部分链表的第一个节点
    • 无论哪种情况,slow 指针都为我们准确地划分出了链表的后半部分。
  2. 第二步:反转链表的后半部分

    • slow 指针指向的节点开始,就是链表的后半部分。
    • 算法调用一个辅助函数 reverseList(slow),将这后半部分的链表进行原地反转。
    • 反转后,会得到一个新的头节点 head2,它指向反转后的后半部分的链表。
  3. 第三步:比较前半部分和反转后的后半部分

    • 现在,我们有了两个“子链表”需要比较:
      • 原始链表的前半部分,从 head 开始。
      • 反转后的后半部分,从 head2 开始。
    • 通过一个 while 循环,同时遍历这两个子链表(循环条件是 head2 != null,因为后半部分可能比前半部分短一个节点,在奇数长度情况下)。
    • 在循环中,比较两个指针指向节点的值 head.valhead2.val
      • 如果任何一对节点的值不相等,说明链表不是回文结构,立即返回 false
      • 如果值相等,则将两个指针都向前移动一步。
    • 如果循环正常结束(即所有对应的节点值都相等),说明链表是回文的,返回 true

注意:这个算法会修改原始链表的结构(后半部分被反转)。如果题目要求不能修改原链表,则需要在比较完成后再将后半部分反转回来恢复原状。

完整代码

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {/*** 判断一个单链表是否是回文链表。* @param head 链表的头节点* @return 如果是回文链表则返回 true,否则返回 false*/public boolean isPalindrome(ListNode head) {// 步骤 1: 使用快慢指针找到链表的中点或后半部分的起点ListNode slow = head;ListNode fast = head;// fast 每次走两步,slow 每次走一步while (fast != null && fast.next != null) {fast = fast.next.next;slow = slow.next;}// 循环结束后,slow 指向了后半部分的头节点// 步骤 2: 反转链表的后半部分// head2 是反转后链表的头节点ListNode head2 = reverseList(slow);// 步骤 3: 比较前半部分和反转后的后半部分// head 指向原始链表的头,head2 指向反转后半部分的头while (head2 != null) {// 如果对应节点的值不相等,则不是回文链表if (head.val != head2.val) {return false;}// 移动两个指针,继续比较下一对节点head = head.next;head2 = head2.next;}// 如果循环正常结束,说明所有对应节点都相等,是回文链表return true;}/*** 辅助函数:原地反转一个单链表(迭代法)。* @param head 要反转的链表的头节点* @return 反转后新链表的头节点*/public ListNode reverseList(ListNode head) {ListNode pre = null;ListNode cur = head;while (cur != null) {ListNode nxt = cur.next;cur.next = pre;pre = cur;cur = nxt;}return pre;} 
}

时空复杂度

时间复杂度:O(N)

算法主要包含三个步骤,我们分别分析其时间复杂度:

  1. 查找中点:快慢指针遍历链表,slow 指针走了 N/2 步。时间复杂度为 O(N)
  2. 反转后半部分reverseList 函数被调用在链表的后半部分,其长度约为 N/2。反转一个长度为 k 的链表需要 O(k) 的时间。因此,这部分的时间复杂度是 O(N)
  3. 比较两部分:最后的 while 循环遍历了链表的后半部分,长度约为 N/2。时间复杂度为 O(N)

综合分析
算法的总时间复杂度是 O(N) + O(N) + O(N) = O(N)

空间复杂度:O(1)

  1. 主要存储开销:该算法没有使用任何与输入规模 N 成比例的额外数据结构(如数组或哈希表)。
  2. 辅助变量
    • isPalindrome 方法中,只使用了 slow, fast, head2 等几个指针变量。
    • reverseList 方法中,也只使用了 pre, cur, nxt 等几个指针变量。
    • 这些变量的数量是固定的,与链表长度无关。

综合分析
算法所需的额外辅助空间是常数级别的。因此,其空间复杂度为 O(1)。这是一个空间效率最优的原地算法。

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

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

相关文章

【源力觉醒 创作者计划】开源、易用、强中文:文心一言4.5或是 普通人/非AI程序员 的第一款中文AI?

前言 你有没有发现,AI 正在悄悄渗透进我们的生活:写文案、画插图、做PPT、答作业,它几乎无所不能😍 !但很多人可能会问: AI,我能用吗?用得起吗?适合我吗?特别…

【保姆级喂饭教程】Git图形化客户端Sourcetree安装及使用教程

目录 前言一、SourceTree简介二、安装教程三、使用教程1. 添加仓库 四、评价总结后记参考文献 前言 在查找Git Flow实现工具的时候,看到了SourceTree,支持Git Flow、GitHub Flow等多种Git工作流,安装简单学习一下。 一、SourceTree简介 Git的…

【kafka】kafka3.3.2常用命令

查看kafka服务版本 [rootlocalhost eicar]# kafka-server-start.sh --version [2025-06-23 11:10:54,106] INFO Registered kafka:typekafka.Log4jController MBean (kafka.utils.Log4jControllerRegistration$) 3.3.2 (Commit:b66af662e61082cb) [rootlocalhost eicar]#查看消…

LastActivityView -查看电脑上的所有操作记录

LastActivityView 是一款由 NirSoft 开发的免费工具,适用于 Windows 操作系统。它能够通过分析系统日志、Prefetch 文件、图标缓存数据库、注册表以及蓝屏 Dump 文件等多种来源,综合展示电脑从安装系统至今的所有操作记录。 LastActivityView 的功能 L…

English Practice - Day 3

Hi ChatGPT, I am back. can we start today’s english practice? Welcome back, Kelly! 😊 Yes — let’s begin today’s English practice! You’re doing great by showing up consistently. 💪 Q: What’s the weather like today w…

quickbi看板内嵌入powerbi页面(含单点登录解决方法)

quickbi看板内嵌入powerbi页面(含单点登录解决方法) 实现步骤 要实现在quickbi看板中嵌入powerbi页面,分4步来实现。 1. 新建quickbi看板, 2. 添加内嵌页面 3. 获取Powerbi链接 4. 将powerbi链接粘贴到内嵌页面中 第一步&am…

CentOS-6如何配置网络设置IP? 笔记250706

CentOS-6如何配置网络设置IP? 笔记250706 1️⃣ 参考 1 CentOS 6 网络配置完全指南 在 CentOS 6 中配置网络设置主要涉及修改 /etc/sysconfig/network-scripts/ 目录下的配置文件。以下是详细配置步骤: 一、配置静态 IP 地址 1. 编辑网卡配置文件 vi /etc/sys…

WPF学习笔记(24)命令与ICommand接口

命令与ICommand接口一、命令1. ICommandSource2. 示例3. CommandBinding二、ICommand1.ICommand接口2. ICommand用法3. CanExecute总结一、命令 官方文档:https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/advanced/commanding-overview 1. ICommandSource 官…

TCP长连接保持在线状态

TCP长连接是指在一次TCP连接建立后,保持连接状态较长时间,用于多次数据传输,而不是每次通信后立即断开。这种机制对于需要频繁通信的应用非常重要。 保持TCP长连接在线的方法 1. 心跳机制(Heartbeat) 实现原理:定期发送小数据包…

华为OD机试 2025B卷 - 报文响应时间 (C++ Python JAVA JS C语言)

2025B卷目录点击查看: 华为OD机试2025B卷真题题库目录|机考题库 + 算法考点详解 2025B卷 100分题型 题目描述 IGMP 协议中,有一个字段称作最大响应时间 (Max Response Time) ,HOST收到查询报文,解折出 MaxResponsetime 字段后,需要在 (0,MaxResponseTime] 时间 (s) 内选…

深入理解微服务中的服务注册与发现(Consul)

在当今数字化浪潮下,微服务架构凭借其高内聚、低耦合的特性,成为众多企业构建复杂应用系统的首选方案。然而,随着服务数量的不断增加,服务之间的调用与管理变得愈发复杂。这时,服务注册与发现就如同微服务架构中的 “导…

Zephyr【2】-----内核调度[1]

内核调度 Zephyr 内核的调度器是基于什么原则选择当前执行线程的? 总是选择优先级最高的就绪线程作为当前线程。 当多个线程优先级相同时,调度器会如何选择? 线程的 “就绪状态” 和 “非就绪状态” 分别指什么?哪些情况会导致…

LangChain内置工具包和联网搜索

目录 一、什么是智能体?工具包又是什么? 二、智能体(Agent)的出现是为了解决哪些问题? 三、LangChain里面创建工具方式 3.1 tool 装饰器:用来定义一个简单的工具函数,, 可以直接给函数加上这个装饰器,让函数成为可调用的工具…

用c++做游戏开发至少要掌握哪些知识?

成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于用C做游戏开发的相关内容! 关…

vue3使用summernote

一、安装 npm install summernote-vue jquery summernote bootstrap popperjs/core二、summernoteEditor.vue <template><div ref"editorRef"></div> </template><script setup> import {ref, onMounted, onBeforeUnmount, watch} f…

低代码平台的性能测试实践与挑战

一、引言 近年来&#xff0c;低代码平台&#xff08;Low-Code Platform&#xff09;正在快速改变企业软件开发方式。Gartner 预测&#xff0c;到 2025 年&#xff0c;超过 70% 的应用开发将基于低代码或无代码技术。通过“拖拉拽建模 图形化逻辑 一键发布”&#xff0c;企业…

Stereolabs ZED系列与ZED X立体相机系列对比:如何根据项目需求选择?

Stereolabs是全球领先的三维视觉技术公司&#xff0c;专注于为机器人、自动化和空间感知等领域提供高性能视觉解决方案。其ZED立体相机系列包括ZED和ZED X两大系列&#xff0c;分别针对多场景三维感知和工业级应用设计&#xff0c;为企业和开发者提供了丰富的选择。ZED系列&…

Spring Boot登录认证实现学习心得:从皮肤信息系统项目中学到的经验

前言 最近通过一个皮肤信息管理系统的项目实践&#xff0c;深入学习了Spring Boot框架中登录认证功能的实现方式。这个项目涵盖了从后端配置到前端集成的完整流程&#xff0c;让我对现代Web应用的安全机制有了更深刻的理解。本文将分享我在这个过程中的学习心得和技术要点。 …

【初阶数据结构】双向链表

文章目录 双向链表1.申请节点2.链表初始化3.尾插4.打印链表5.头插6.尾删7.头删8.查找9.指定位置插入10.删除pos节点11.链表的销毁12.程序源码 双向链表 链表分类 8种 (带头/不带头 单向/双向 循环/循环) 最常用两种 单链表(不带头单向不循环链表) 双向链表&#xff08;带头双向…

从 Prompt 管理到人格稳定:探索 Cursor AI 编辑器如何赋能 Prompt 工程与人格风格设计(下)

六、引入 Cursor AI 编辑器的开发流程革新 在整个系统开发过程中&#xff0c;我大量采用了 Cursor 编辑器作为主要的开发环境&#xff0c;并获得以下关键收益&#xff1a; 具备 AI 补全与代码联想功能&#xff1a;支持通过内置 Copilot 模型对 Python、FastAPI、YAML、JSON 等…