面试经典150题——K 个一组翻转链表

1. 题目描述

image-20240316102109719

2. 题目分析与解析

在这里推荐大家看一下这个解题思路:

https://www.bilibili.com/video/BV11w411V7Ar/?spm_id_from=333.337.search-card.all.click&vd_source=7ea7c036902f5cb73c7f4781d1b0eaff

整体的算法思路如下:

  1. 初始化

    • 创建一个虚拟头节点 dummy,并将其 next 指针指向原链表的头节点 head。这是为了在翻转包含头节点的子链表时能够方便地处理。
    • 定义 cur 指针并指向 dummy,用于标记当前处理的子链表的前一个节点。
  2. 翻转过程

    • 开启一个循环,直到 cur 为空。
    • 在每次循环中,尝试翻转从 cur.next 开始的 k 个节点,并将翻转后的子链表头返回给 cur.next,以此来实现链表的局部翻转。
  3. 移动 cur 指针

    • 翻转完成后,将 cur 指针移动 k 个节点,准备下一轮的翻转操作。这里使用了一个 for 循环来确保 cur 正确移动。
  4. 翻转函数 reverse

    • 先通过遍历计算出从 head 开始的子链表的实际长度 n
    • 如果长度小于 k,说明剩余节点不足 k 个,不需要翻转,直接返回原 head
    • 如果长度足够,使用三个指针 preslowfast 实现局部翻转。
    • pre 初始化为 null,作为已翻转部分的尾节点;slow 初始化为 head,作为当前要翻转的节点;fast 初始化为 head.next,作为下一个要翻转的节点。
    • 通过迭代,将 slow.next 指向 pre,然后依次更新 preslowfast,完成 k 个节点的翻转。
  5. 翻转后的连接

    • 翻转后,原链表的 head 节点变成了新的尾节点,需要将其 next 指向 fast,以连接翻转段之后的链表部分。
  6. 结果返回

    • 翻转操作完成后,通过 dummy.next 返回新链表的头节点。

3. 代码实现

image-20240407082152660

image-20240407082203760

4. 相关复杂度分析

时间复杂度

  1. 对于整个链表的遍历,即使有两层循环结构(一个是while循环,另一个是reverse函数中的while循环),每个节点仍然只被访问了常数次(最多两次,一次是在判断是否有足够的节点进行下一次翻转,一次是在实际翻转中)。因此,遍历链表的时间复杂度是 O(n),其中 n 是链表中的节点数量。

  2. reverse函数会被调用 n/k 次(因为每次翻转 k 个节点),每次翻转操作需要 O(k) 的时间。但由于这些操作是并行的,总体上仍然是 O(n)。

因此,整个算法的时间复杂度是 O(n)。

空间复杂度

  1. 虚拟头节点 dummy 和指针 curpreslowfast 都只需要常数空间。

  2. 算法没有使用额外的数据结构来存储节点或其他信息,所有操作都是在原链表上直接进行的。

  3. reverse函数是递归调用的,但由于它在每次翻转后都会断开递归调用,因此不会在栈上累积大量的调用帧。

综上所述,算法的空间复杂度是 O(1),也就是常数空间复杂度,满足题目要求使用常数级额外空间的约束。

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

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

相关文章

【第十五篇】使用BurpSuite实现IDOR越权(实战案例)

程序不存在严格的访问控制,从而实现未授权访问等。 如图,用户 ID 用于检索相关用户的数据,以呈现帐户页面。 思路:进行爆破或修改请求后发包,查看是否存在IDOR越权 操作:遍历ID参数,查看回显 …

JWT/JWS/JWE

JWT(JSON Web Token):一种基于JSON格式,用于在Web应用中安全传递用户身份验证和授权信息的标准令牌,可以包含签名(JWS)和加密(JWE)的信息 MacAlgorithm(Message Authentication Code Algorithm):消息认证码算法 HMAC(Hash-based…

Vue - 3( 15000 字 Vue 入门级教程)

一:初识 Vue 1.1 收集表单数据 收集表单数据在Vue.js中是一个常见且重要的任务,它使得前端交互变得更加灵活和直观。 Vue中,我们通常使用v-model指令来实现表单元素与数据之间的双向绑定,从而实现数据的收集和更新。下面总结了…

内容检索(2024.04.07)

随着创作数量的增加,博客文章所涉及的内容越来越庞杂,为了更为方便地阅读,后续更新发布的文章将陆续在此汇总并附上原文链接,感兴趣的小伙伴们可持续关注文章发布动态! 本期更新内容: 1. 真实案例分享--P…

数据结构|排序总结(1)|直接插入排序

排序分类 插入排序:直接插入排序,希尔排序 选择排序:选择排序,堆排序 交换排序:冒泡排序,快速排序 归并排序 插入排序 直接插入排序 相当于摸牌,例如我们现在手上有{2,4&#xff0…

Python实现 AI 绘图(非常详细)零基础入门到精通,收藏这一篇就够了

今天给大家带来了 Python 对接阿里大模型,通过 AI 实现文本生成图片。 相关资料 这个功能使用的主要 API 是阿里的大模型服务。 开通服务 阿里文档 https://help.aliyun.com/zh/dashscope/developer-reference/quick-start-1?disableWebsiteRedirecttrue 获取 a…

007 CSS的继承和层叠 元素特性

文章目录 CSS属性的继承CSS属性的层叠选择器的权重 HTML元素的类型编写HTML注意事项元素隐藏方法CSS属性-overflowCSS样式不生效可能原因 CSS属性的继承 如果一个属性具备继承性,那么在该元素上设置后,它的后代元素都可以继承这个属性 如果后代元素自己…

YOLOv5改进--轻量化YOLOv5s模型

文章目录 1、前言2、轻量化模型结构:3、模型对比4、训练结果图5、目标检测文章 1、前言 在边缘设备的场景下,目前的YOLOv5s,虽然能够快速实现目标检测,但是运行速度依旧稍慢点,本文在牺牲一点精度前提下,提…

Mysql【索引覆盖、索引下推、索引合并、索引跳跃】介绍

索引覆盖、索引下推、索引合并、索引跳跃都是Mysql对索引的优化手段,它们的思想就是尽量让查询数据走索引,那它们有什么区别呢? 一、首先介绍一下MySQL体系结构 上图来自MySQL官方文档。 通常把MySQL从上至下分为以下几层: MySQ…

简约风个人导航页源码

个人导航页源码,可以用作网站地址发布页,记事本修改html文件里的内容即可 源码下载 简约风个人导航页源码

简历复印--原型模式

1.1 夸张的简历 简历的打印。"对编程来说,简单的复制粘贴极有可能造成重复代码的灾难。我所说的意思你根本还没听懂。那就以刚才的例子,我出个需求你写写看,要求有一个简历类,必须要有姓名,可以设置性别和年龄&am…

7 个 iMessage 恢复应用程序/软件可轻松恢复文本

由于误操作、iOS 升级中断、越狱失败、设备损坏等原因,您可能会丢失 iPhone/iPad 上的 iMessages。意外删除很大程度上增加了这种可能性。更糟糕的是,这种情况经常发生在 iDevice 缺乏备份的情况下。 (iPhone消息消失还占用空间?&…