LeetCode 25 - K 个一组翻转链表
LeetCode 25 - K 个一组翻转链表
这道题是一个典型的链表操作题,考察我们对链表的精确操作,包括反转链表、分组处理、递归和迭代的结合应用等。还可以通过变体问题延伸到优先队列操作、归并、分块等,这使得它成为面试中的高频考题之一。
题目描述
给你一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。
k是一个正整数,它的值小于或等于链表的长度。- 如果节点总数不是
k的整数倍,那么请将最后剩余节点保持原样。 - 你不允许更改节点的值,只能调整节点指针的方向。
示例
输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]
解题思路与分析
核心简化问题
- 分段处理链表:将链表分成每
k个一组。 - 对每一组执行反转操作。
- 当遍历到不足
k个节点的部分时,维持原顺序不再反转。 - 方法可以通过递归或迭代完成。
解法与代码模板
解法 1:递归法
核心思路
- 使用递归配合局部反转:
- 确定链表是否有足够的
k个节点:如果不足k个,直接返回头节点。 - 如果有足够的
k个节点:- 完成当前组内
k个节点的反转, - 递归地对剩余部分链表继续处理。
- 完成当前组内
- 将当前反转的部分连接到下一组递归结果。
- 确定链表是否有足够的
模板代码
class Solution {public ListNode reverseKGroup(ListNode head, int k) {// 检查链表是否有足够的 k 个节点ListNode current = head;int count = 0;while (current != null && count < k) {current = current.next;count++;}// 如果不足 k 个节点,直接返回原链表if (count < k) {return head;}// 反转当前 k 个节点ListNode prev = null, next = null;current = head;for (int i = 0; i < k; i++) {next = current.next; // 暂存下一节点current.next = prev; // 改变指针方向prev = current; // 移动 prev 指针current = next; // 移动 current 指针}// 递归处理剩余链表,并连接反转后的部分head.next = reverseKGroup(current, k);// 返回反转后的头节点return prev;}
}
复杂度分析
- 时间复杂度: O(N)
- 每个节点仅访问一次。
- 空间复杂度: O(N / k)
- 递归调用栈的深度为
(链表长度 / k)。
- 递归调用栈的深度为
优缺点
- 优点:代码简洁并且逻辑清晰,适合递归思路的场景。
- 缺点:会造成大量递归栈调用,链表很长时可能出现栈溢出。
解法 2:迭代法
核心思路
- 相对于递归法,用 迭代 来实现分组反转链表,避免了递归栈空间的开销:
- 使用 哑结点(
dummy node)作为新链表的起始位置,方便连接。 - 遍历链表,分别找到每一组的起始结点和结束结点。
- 将当前分组进行反转,并连接到已经处理好的链表部分。
- 当剩余节点不足时,停止反转,直接连接到尾部。
- 使用 哑结点(
模板代码
class Solution {public ListNode reverseKGroup(ListNode head, int k) {// 创建哑结点ListNode dummy = new ListNode(-1);dummy.next = head;ListNode prevGroupEnd = dummy;while (true) {// 找到当前组的开始和结束节点ListNode groupStart = prevGroupEnd.next;ListNode groupEnd = prevGroupEnd;for (int i = 0; i < k; i++) {groupEnd = groupEnd.next;if (groupEnd == null) {return dummy.next; // 不足 k 个节点}}// 下一组的起始节点ListNode nextGroupStart = groupEnd.next;// 反转当前组reverseList(groupStart, groupEnd);// 连接反转后的部分prevGroupEnd.next = groupEnd; // 当前组的结尾变成起始点groupStart.next = nextGroupStart;// 更新 prevGroupEnd 为这一组的最后节点prevGroupEnd = groupStart;}}private void reverseList(ListNode start, ListNode end) {ListNode prev = null, current = start, next = null;ListNode stop = end.next; // 保存停止位置while (current != stop) {next = current.next;current.next = prev;prev = current;current = next;}}
}
复杂度分析
- 时间复杂度: O(N)
- 每个节点最多被访问两次(反转和连接)。
- 空间复杂度: O(1)
- 没有额外栈空间的使用,仅需常数级别指针。
优缺点
- 优点: 比递归方法更高效,适用于超长链表。
- 缺点: 实现逻辑上稍微复杂。
解法 3:栈辅助法
核心思路
- 借助栈来反转每一组节点:
- 遍历链表,将
k个节点压入栈中。 - 当栈中节点数量达到
k时,出栈并重新连接节点指针。 - 如果节点数量不足
k,直接连接剩余部分。
- 遍历链表,将
模板代码
import java.util.Stack;class Solution {public ListNode reverseKGroup(ListNode head, int k) {if (head == null || k <= 1) return head;Stack<ListNode> stack = new Stack<>();ListNode dummy = new ListNode(-1);ListNode prev = dummy;dummy.next = head;while (head != null) {// 将 k 个节点压入栈for (int i = 0; i < k && head != null; i++) {stack.push(head);head = head.next;}// 判断栈中是否有足够的 k 个节点if (stack.size() == k) {// 出栈并重新连接while (!stack.isEmpty()) {prev.next = stack.pop();prev = prev.next;}prev.next = head; // 连接当前组与下一组}}return dummy.next;}
}
复杂度分析
- 时间复杂度: O(N)
- 每个节点入栈、出栈一次。
- 空间复杂度: O(k)
- 栈空间用于存储每组
k个节点。
- 栈空间用于存储每组
优点和缺点
- 优点: 实现简单,不需要复杂链表反转逻辑。
- 缺点: 额外使用栈空间,适用于较短链表。
经典变体问题
变体 1:反转链表 II
- 反转链表的第 m 到第 n 个节点(LeetCode 92)。
- 解法类似,利用迭代进行指定区域反转。
变体 2:K 个一组翻转链表,但跳过一些组
- 例如:对链表分组,但只翻转奇数组或者仅反转偶数组。
变体 3:分组排序
- 例如:对链表的每组节点排序而不是反转。
快速 AC 总结
- 递归与迭代优先掌握:
- 递归:逻辑清晰但容易出现栈溢出,适用于理论验证。
- 迭代:高效且空间复杂度较低,是面试中优选方法。
- 哑节点技巧:
- 在处理链表操作时,借助哑节点可以避免很多冗余的头节点边界条件处理。
- 多练变体问题:
- 如部分反转、跳过反转的场景,可以轻松迁移基础模板。
通过对链表反转操作的熟悉,配合经典模板化实现,可以快速应对链表转化类问题,并高效解决工程中复杂数据结构操作场景。
相关文章:
LeetCode 25 - K 个一组翻转链表
LeetCode 25 - K 个一组翻转链表 这道题是一个典型的链表操作题,考察我们对链表的精确操作,包括反转链表、分组处理、递归和迭代的结合应用等。还可以通过变体问题延伸到优先队列操作、归并、分块等,这使得它成为面试中的高频考题之一。 题目…...
一文读懂智能硬件定位:开启智能时代的精准导航
一、智能硬件定位是什么 (一)基本概念阐述 智能硬件定位,本质上是智能硬件依托一系列特定技术手段,精准测定自身所处地理位置的过程。这一实现过程离不开诸多关键技术的支撑。传感器堪称其中的 “排头兵”,像加速度计…...
夸父工具箱(安卓版) 手机超强工具箱
如今,人们的互联网活动日益频繁,导致手机内存即便频繁清理,也会莫名其妙地迅速填满,许多无用的垃圾信息悄然占据空间。那么,如何有效应对这一难题呢?答案就是今天新推出的这款工具软件,它能从根…...
Html5学习教程,从入门到精通,HTML5 列表语法知识点及案例代码(11)
HTML 列表语法知识点及案例代码 一、HTML 列表类型 HTML 提供了三种列表类型: 无序列表 (Unordered List):使用 <ul> 标签定义,列表项使用 <li> 标签定义。默认情况下,列表项前面会显示黑色圆点。有序列表 (Ordere…...
内核进程调度队列(linux的真实调度算法) ─── linux第13课
目录 内核进程调度队列的过程 一个CPU拥有一个runqueue(运行队列在内存) 活动队列(active) 过期队列(expired) active指针和expired指针 重绘runqueue linux内核O(1)调度算法 总结 补充知识: 封装链式结构的目的是: 仅使用封装链式结构可以得到全部的task_struct的信…...
16.7 LangChain LCEL 极简入门:Prompt + LLM 的黄金组合
LangChain LCEL 极简入门:Prompt + LLM 的黄金组合 关键词:LCEL 基础示例、Prompt 模板设计、LLM 集成、链式调用、LangChain 快速上手 1. 基础架构解析:Prompt → LLM → Output 1.1 核心组件交互流程 #mermaid-svg-pv3fH3mEKyE4TNaF {font-family:"trebuchet ms&qu…...
Spring线程池学习笔记
Spring提供了多种方式来配置和使用线程池,最常见的是通过TaskExecutor和ThreadPoolTaskExecutor。 Spring线程池 TaskExecutor 接口 TaskExecutor 是Spring框架中的一个接口,它是对Java的Executor接口的简单封装。它的主要目的是为了提供一个统一的接口…...
ArcGIS操作:08 计算shp面积并添加到属性表
1、打开属性表 注意:计算面积前,需要把shp的坐标系转化为投影坐标系(地理坐标系用于定位、投影坐标系用于测量) 2、创建字段 3、编辑字段名、类型 4、选择字段,计算几何 5、选择属性、坐标系、单位...
安卓音频框架混音器
在 Android 音频框架中,混音器(Mixer) 是 AudioFlinger 服务的核心组件之一,负责将多个音频流(来自不同应用或系统组件)混合为统一的输出流,再传输到音频硬件设备(如扬声器、耳机等&…...
左值引用与指针的区别
很多朋友遇到过这个问题:左值引用与指针有哪些区别?脑子里闪过很多答案,但大部分都是各自的定义,真要说他们两个有什么区别,有的时候还这是说不上来。本文针对这个问题进行归纳总结,希望对大家有所帮助。 …...
Linux基础使用和程序部署
目录 1.Linux 1.2 Linux的环境搭配 1.2.1 使用云服务器 1.2.2使用终端软件连接到Linux 1.3. Linux 常用命令 1. ls:列出当前目录中的文件和子目 2.pwd:显示当前工作目录的路径 3.cd:改变工作目录,将当前的工作目录改变到指定目…...
Linux驱动开发之串口驱动移植
原理图 从上图可以看到RS232的串口接的是UART3,接下来我们需要使能UART3的收发功能。一般串口的驱动程序在内核中都有包含,我们配置使能适配即可。 设备树 复用功能配置 查看6ull如何进行uart3的串口复用配置: 设备树下添加uart3的串口复用…...
计算机毕业设计SpringBoot+Vue.js美食推荐系统商城(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
指针小节.
....指针的第四个作用:函数的结果和计算状态分开 高级指针。。 指针中的数据类型:获取字节数据的个数。步长:指针移动一次的字节个数(int,long。。。各自字节都不同) 加减都可以...
[Qt5] QJson数据之间的转换以及QByteArray图像数据压缩
📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现…...
2025年能源工作指导意见
2025年是“十四五”规划收官之年,做好全年能源工作意义重大。为深入贯彻落实党中央、国务院决策部署,以能源高质量发展和高水平安全助力我国经济持续回升向好,满足人民群众日益增长的美好生活用能需求,制定本意见。 一、总体要求…...
Android 获取jks的SHA1值:java.io.IOException: Invalid keystore format
命令生成 keytool -list -v -keystore 全路径.jks -alias 别名 -storepass 密码 -keypass 密码 1、遇到 的问题: 通过快捷键 ‘win r’ 启动的小黑框运行上面的命令会出现下面这个错误keytool 错误: java.io.IOException: Invalid keystore format 2、解决问题 …...
深入探索像ChatGPT这样的大语言模型-02-POST training supervised finetuning
参考 【必看珍藏】2月6日,安德烈卡帕西最新AI普及课:深入探索像ChatGPT这样的大语言模型|Andrej Karpathy fineweb知乎翻译介绍 fineweb-v1原始连接 fineweb中文翻译版本 Chinese Fineweb Edu数据集 查看网络的内部结果,可以参…...
广义线性模型下的数据分析(R语言)
一、实验目的: 通过上机试验,掌握利用R实现线性回归分析、逻辑回归、列联分析及方差分析,并能对分析结果进行解读。 数据: 链接: https://pan.baidu.com/s/1JqZ_KbZJEk-pqSUWKwOFEw 提取码: hxts 二、实验内容: 1、2…...
AutoMQ:无需 Cruise Control 实现 Kafka 的自动分区再平衡
导读:AutoMQ是一款贯彻云优先理念来设计的 Kafka 替代产品。AutoMQ 创新地对 Apache Kafka 的存储层进行了基于云的重新设计,在 100% 兼容 Kafka 的基础上通过将持久性分离至 EBS 和 S3 带来了 10x 的成本降低以及 100x 的弹性能力提升,并且相…...
Krita插件组件缺失故障排除实战指南
Krita插件组件缺失故障排除实战指南 【免费下载链接】krita-ai-diffusion Streamlined interface for generating images with AI in Krita. Inpaint and outpaint with optional text prompt, no tweaking required. 项目地址: https://gitcode.com/gh_mirrors/kr/krita-ai-…...
火影迷的AI绘画神器:忍者绘卷Z-Image Turbo零基础入门实战
火影迷的AI绘画神器:忍者绘卷Z-Image Turbo零基础入门实战 1. 前言:当火影忍者遇上AI绘画 作为一名火影迷,你是否曾经幻想过自己也能创造出独特的忍者世界角色?现在,借助"忍者绘卷Z-Image Turbo"这款专为火…...
GLM-4.1V-9B-Base成本优化指南:GPU显存管理与推理性能调优
GLM-4.1V-9B-Base成本优化指南:GPU显存管理与推理性能调优 1. 为什么需要关注大模型推理成本 大模型在带来强大能力的同时,也伴随着高昂的GPU算力成本。GLM-4.1V-9B-Base作为一款9B参数量的视觉语言大模型,在实际部署中常常面临显存不足、推…...
5分钟部署阿里RexUniNLU:Web界面操作,无需编程基础
5分钟部署阿里RexUniNLU:Web界面操作,无需编程基础 1. 认识RexUniNLU:零样本理解的神器 想象一下,你刚接手一个新项目,老板丢给你一堆用户评论,要求你快速分析出大家对产品"屏幕"、"续航&…...
Chandra AI在教育领域的应用:智能学习助手开发
Chandra AI在教育领域的应用:智能学习助手开发 1. 引言 想象一下这样的场景:一个学生在深夜复习功课,遇到一道数学难题却找不到老师请教;一个上班族想学习新技能,但时间碎片化难以系统学习;一个老师面对几…...
ArchLinux新手必看:用Fcitx5搞定中文输入,从安装到美化皮肤保姆级教程
ArchLinux新手必看:用Fcitx5搞定中文输入,从安装到美化皮肤保姆级教程 刚接触ArchLinux的新手们,面对命令行界面时总会有些手足无措。特别是当需要输入中文时,如何配置一个既美观又实用的输入法成了许多人的第一个挑战。Fcitx5作…...
LeetCode Hot 100 | 滑动窗口专题(C++ 题解)
LeetCode Hot 100 | 滑动窗口专题(C 题解) 滑动窗口是处理连续子数组/子字符串问题的核心技巧,通过维护一个可变窗口来避免重复计算,将 O(n) 的暴力枚举优化到 O(n)。本文涵盖 LeetCode Hot 100 中 2 道经典滑动窗口题目ÿ…...
【数据结构】树的定义、核心术语与关键性质全解析
在数据结构的世界里,树(Tree) 是一种极其重要的非线性结构,它完美模拟了自然界中树的层次关系,从文件系统、组织结构,到算法中的二叉搜索树、堆,再到 AI 中的决策树,树的身影无处不在…...
从《阵列天线分析与综合》到HFSS实战:手把手教你仿真4x1微带天线阵(含相位扫描设置)
从理论到实践:HFSS中4x1微带天线阵的建模与相位扫描全解析 微带天线阵列因其低剖面、易集成和成本优势,在现代通信系统中扮演着重要角色。对于刚接触天线设计的工程师和学生而言,如何将《阵列天线分析与综合》等经典教材中的理论概念转化为可…...
用STM32和示波器搞定美的/格力空调红外遥控(附完整C代码)
STM32实战:从示波器捕获到空调红外协议逆向全解析 红外遥控技术看似简单,却蕴含着精妙的时序设计和协议逻辑。作为一名长期混迹于硬件开发领域的工程师,我经常遇到需要逆向控制家电的场景。最近在智能家居项目中,就遇到了需要通过…...
