leetcode25:k个一组链表反转

news2024/11/14 14:06:31

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

示例 2:

输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]

提示:

  • 链表中的节点数目为 n
  • 1 <= k <= n <= 5000
  • 0 <= Node.val <= 1000

进阶:你可以设计一个只用 O(1) 额外内存空间的算法解决此问题吗?

步骤 1:问题分析

问题性质

  • 给定一个单链表 head,需要每 k 个节点为一组进行翻转,返回翻转后的链表。
  • 如果链表长度不是 k 的整数倍,则最后不足 k 个节点的部分不翻转,保持原顺序。

输入输出条件

  • 输入:链表头节点 head 和正整数 k
  • 输出:修改后的链表头节点。

限制

  • 链表节点数 n[1, 5000] 范围内。
  • 1 <= k <= n <= 5000
  • 仅能进行节点交换,不能更改节点的值。

边界条件

  • k = 1:不需要任何反转,直接返回链表。
  • n < k:链表长度小于 k,则不进行任何操作,直接返回链表。
  • k = n:链表整体需要翻转一次。

步骤 2:解题思路

我们可以分组进行局部翻转,用双指针法进行链表分段,并通过指针操作进行局部反转,保持空间复杂度为 O(1)

算法设计思路

  1. 遍历链表,按 k 个分段

    • 首先遍历链表来获取节点总数 n,计算有多少完整的 k 段可以进行翻转。
  2. 逐组反转

    • 使用一个虚拟节点 dummy 来简化头节点翻转的情况,dummy->next 指向 head
    • 设置一个指针 prev 来跟踪每一组的前驱节点,最初指向 dummy
    • 对每个完整的 k 段进行翻转,翻转后更新 prev,指向这一段的结尾节点,准备开始下一段翻转。
  3. 执行翻转

    • 对每个 k 长度的组,使用双指针 curnext 实现局部反转。
    • 在每一轮的反转中,将当前节点的 next 指向前驱,逐个调整,形成反转后的组链表。
  4. 剩余节点保持不变

    • 如果剩下的节点不足 k 个,则直接返回,不对剩余部分操作。

复杂度分析

  • 时间复杂度:O(n),因为我们最多遍历链表两次(一次统计长度,一次进行翻转)。
  • 空间复杂度:O(1),因为只用到常量级的辅助指针。

步骤 3:C++代码实现

代码详解

  1. 初始化 dummy:创建一个虚拟节点 dummydummy->next 指向 head,用来简化链表头部处理的边界情况。
  2. 计算链表长度:遍历链表,记录链表长度 length,判断需要翻转的次数。
  3. k 个节点为一组翻转
    • 使用 curnext 指针来逐个反转组内的节点。
    • 每次反转都调整当前节点的 next 指向,形成局部的链表反转。
  4. 更新 prev:每次完成 k 个节点的翻转后,将 prev 更新到当前翻转段的结尾节点,为下一组翻转做准备。
  5. 返回结果:最终返回 dummy->next,即翻转后的链表头。

步骤 4:启发与算法优化

  1. 局部翻转的技巧:使用双指针实现链表局部翻转,节省空间的同时提高了效率。这种技巧可用于链表的其他翻转和旋转操作。

  2. 优化时间复杂度:通过一次遍历得到链表长度,然后用双指针实现局部反转,避免了多次遍历,实现了 O(n) 的时间复杂度。

  3. 链表题的边界处理:通过使用 dummy 节点,可以简化对头节点的特殊处理。dummy 节点是链表题中非常实用的技巧,使链表操作统一,无需额外判断头节点的边界情况。


步骤 5:实际应用

应用场景: 在实际中,链表分组翻转的算法在数据处理和批量更新方面非常有用。例如:

  • 内存块反转:在存储器管理中,可以使用链表结构管理内存块,并对内存块按组进行翻转,以均衡访问时间或分配负载。

  • 实时数据流处理:对于实时数据流管理,如果需要分批处理一定量的数据,类似的链表分组翻转算法可以确保数据流按需排序和管理。

示例应用: 在实时传感器数据的分析系统中,假设每次采集的数据以链表形式存储,传感器数据的批量反转可以确保数据以指定的分组进行处理。例如,数据组按 k=5 的分组翻转后,每 5 个数据作为一个批次处理,方便数据整合和批量传输,提高数据分析系统的响应速度。

通过上述方法,可以实现实时数据的批量反转,使得系统按需求对数据流分组处理,提升了数据传输和分析的效率。

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

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

相关文章

《⼆叉搜索树》

《⼆叉搜索树》 1. ⼆叉搜索树的概念2. ⼆叉搜索树的性能分析3 二叉树的功能说明及实现3.1 ⼆叉搜索树的插⼊3.2 ⼆叉搜索树的查找3.3 ⼆叉搜索树的删除 4二叉搜索树的实现代码5 ⼆叉搜索树key和key/value使⽤场景5.1 key搜索场景&#xff1a;5.2 key/value搜索场景&#xff1a…

势不可挡 创新引领 | 生信科技SOLIDWORKS 2025新品发布会·苏州站精彩回顾

2024年11月01日&#xff0c;由生信科技举办的SOLIDWORKS 2025新产品发布会在江苏苏州圆满落幕。现场邀请到制造业的专家学者们一同感受SOLIDWORKS 2025最新功能&#xff0c;探索制造业数字化转型之路。 在苏州站活动开场&#xff0c;达索系统专业客户事业部华东区渠道经理马腾飞…

Spark 程序开发与提交:本地与集群模式全解析

Spark 的介绍与搭建&#xff1a;从理论到实践-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 目录 一、本地开发与远程提交测试 &#xff08;一&#xff09;问题背景 &#xff08;二&#xff09;解决方案 集群环境准…

童装类目电商代运营公司——品融电商

童装类目电商代运营公司——品融电商 随着电商行业的快速发展&#xff0c;童装类目已成为市场中极具潜力的细分领域之一。消费者对童装的需求不仅限于基本穿着功能&#xff0c;更倾向于选购具有设计感、安全性和舒适度的产品。童装类目涵盖婴儿服、儿童套装、家居服、户外服饰等…

利用pythonstudio写的PDF、图片批量水印生成器,可同时为不同读者生成多组水印

现在很多场合需要将PDF或图片加水印&#xff0c;本程序利用pythonstudio编写。 第一步 界面 其中&#xff1a; LstMask:列表框 PopupMenu:PmnMark LstFiles:列表框 PopupMenu:PmnFiles OdFiles:文件选择器 Filter:PDF文件(.PDF)|.PDF|图像文件(.JPG)|.JPG|图像文件(.png…

PDF模板制作与填充(Java)

1.PDF模板制作 准备原始模板 准备一个原始PDF模板&#xff0c;可以编辑好Word&#xff0c;预留出要填充的部分&#xff0c;再转换成PDF格式。 设置表单域 用任意PDF编辑器打开PDF模板文件&#xff0c;设置表单域&#xff0c;下面以WPS为例&#xff1a; 拖动文本域到需要填充的…

kafka中节点如何服役和退役

服役新节点 1&#xff09;新节点准备 &#xff08;1&#xff09;关闭 bigdata03&#xff0c;进行一个快照&#xff0c;并右键执行克隆操作。 &#xff08;2&#xff09;开启 bigdata04&#xff0c;并修改 IP 地址。 vi /etc/sysconfig/network-scripts/ifcfg-ens33修改完记…

笔记本怎么开启TPM2.0_笔记本开启TPM2.0教程(不同笔记本开启tpm2.0方法)

在win11最低要求是提示&#xff0c;电脑必须满足 TPM 2.0&#xff0c;并开需要开启TPM 才能正常安装windows11系统&#xff0c;有很多笔记本的用户问我&#xff0c;笔记本怎么开启tpm功能呢&#xff1f;下面小编就给大家详细介绍一下笔记本开启tpm功能的方法。 如何确认你笔记本…

【PyTorch项目实战】图像分割 —— U-Net:Semantic segmentation with PyTorch

文章目录 一、项目介绍二、项目实战2.1、搭建环境2.1.1、下载源码2.1.2、下载预训练模型2.1.3、下载训练集 2.2、环境配置2.3、模型预测 U-Net是一种用于生物医学图像分割的卷积神经网络架构&#xff0c;最初由Olaf Ronneberger等人于2015年提出。 论文&#xff1a; U-Net: Con…

开源竞争-大数据项目期末考核

开源竞争&#xff1a; 自己没有办法完全掌握技术的时候就开源这个技术&#xff0c;培养出更多的技术依赖&#xff0c;让更多人完善你的技术&#xff0c;那么这不就是在砸罐子吗&#xff1f;一个行业里面总会有人砸罐子的&#xff0c;你不如先砸还能听个想。 客观现实&#xf…

11月7日星期四今日早报简报微语报早读

11月7日星期四&#xff0c;农历十月初七&#xff0c;早报#微语早读。 1、河南&#xff1a;旅行社组织1000人次境外游客在豫住宿2夜以上&#xff0c;可申请激励奖补&#xff1b; 2、主播宣称下播后商品恢复原价构成欺诈&#xff0c;广州市监&#xff1a;罚款5万元&#xff1b;…

HTMLCSS:3D 旋转卡片的炫酷动画

效果演示 这段代码是一个HTML和CSS的组合&#xff0c;用于创建一个具有3D效果的动画卡片。 HTML <div class"obj"><div class"objchild"><span class"inn6"><h3 class"text">我是谁&#xff1f;我在那<…

词嵌入方法(Word Embedding)

词嵌入方法&#xff08;Word Embedding&#xff09; Word Embedding是NLP中的一种技术&#xff0c;通过将单词映射到一个空间向量来表示每个单词 ✨️常见的词嵌入方法&#xff1a; &#x1f31f;Word2Vec&#xff1a;由谷歌提出的方法&#xff0c;分为CBOW&#xff08;conti…

2024下半年系统架构师考试【回忆版】

2024年11月10日&#xff0c;系统架构师考试如期举行&#xff0c;屡战屡败的参试倒是把北京的学校转了好几所。 本次考试时间 考试科目考试时间综合知识、案例分析8:30 - 12:30论文14:30 - 16:30 案例分析 1、RESTful 对于前后端的优势&#xff1b; 2、心跳相对于ping/echo的…

最简单解决NET程序员在centos系统安装c#网站

目前随着技术栈转移&#xff0c;c#程序员如何在linux服务器中部署net程序呢&#xff1f; 我做了一次实验&#xff1a;一般来说runtime和sdk都要装。 1.centos系统内命令行输入命令 sudo yum install dotnet-sdk-6.0 安装6.0版 2.检测下是否成功&#xff1a;dotnet --versio…

参数估计理论

估计理论的主要任务是在某种信号假设下&#xff0c;估算该信号中某个参数&#xff08;比如幅度、相位、达到时间&#xff09;的具体取值。 参数估计&#xff1a;先假定研究的问题具有某种数学模型&#xff0c; 如正态分布&#xff0c;二项分布&#xff0c;再用已知类别的学习样…

java多线程stop() 和 suspend() 方法为何不推荐使用?

大家好&#xff0c;我是锋哥。今天分享关于【java多线程stop() 和 suspend() 方法为何不推荐使用&#xff1f;】面试题。希望对大家有帮助&#xff1b; java多线程stop() 和 suspend() 方法为何不推荐使用&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网…

嵌入式硬件电子电路设计(三)电源电路之负电源

引言&#xff1a;在对信号线性度放大要求非常高的应用需要使用双电源运放&#xff0c;比如高精度测量仪器、仪表等;那么就需要给双电源运放提供正负电源。 目录 负电源电路原理 负电源的作用 如何产生负电源 负电源能作功吗&#xff1f; 地的理解 负电压产生电路 BUCK电…

C++高级编程(8)

八、标准IO库 1.输入输出流类 1)非格式化输入输出 2)put #include <iostream> #include <string> ​ using namespace std; int main() {string str "123456789";for (int i str.length() - 1; i > 0; i--) {cout.put(str[i]); //从最后一个字符开…

Python 分子图分类,GNN Model for HIV Molecules Classification,HIV 分子图分类模型;整图分类问题,代码实战

一、分子图 分子图&#xff08;molecular graph&#xff09;是一种用来表示分子结构的图形方式&#xff0c;其中原子被表示为节点&#xff08;vertices&#xff09;&#xff0c;化学键被表示为边&#xff08;edges&#xff09;。对于HIV&#xff08;人类免疫缺陷病毒&#xff…