【每日算法/刷穿 LeetCode】25. K 个一组翻转链表(困难)
题目描述
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明:
- 你的算法只能使用常数的额外空间。
- 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
递归解法(哨兵技巧)
哨兵技巧我们之前在前面的多道链表题讲过,让三叶来帮你回忆一下:
做有关链表的题目,有个常用技巧:添加一个虚拟头结点(哨兵),帮助简化边界情况的判断。
链表和树的题目天然适合使用递归来做。
我们可以设计一个递归函数,接受一个 ListNode
节点 root 作为参数,函数的作用是将 root 后面的 k
个节点进行交换,交换完成后再将下一个节点传入 …
交换的前提条件:节点 root 后面至少有 k
个节点。同时别忘了应用我们的「哨兵技巧」:
class Solution {public ListNode reverseKGroup(ListNode head, int k) {ListNode dummy = new ListNode(-1);dummy.next = head;ListNode cur = dummy;while (cur != null) {reverse(cur, k);int u = k; while (u-- > 0 && cur != null) cur = cur.next;}return dummy.next;}// reverse 的作用是将 root 后面的 k 个节点进行翻转void reverse(ListNode root, int k) {// 检查 root 后面是否有 k 个节点int u = k;ListNode cur = root;while (u-- > 0 && cur != null) cur = cur.next;if (cur == null) return;// 进行翻转ListNode tail = cur.next;ListNode a = root.next, b = a.next;// 当需要翻转 k 个节点时,中间就有 k - 1 个 next 指针需要翻转while (k-- > 1) {ListNode c = b.next;b.next = a;a = b;b = c;}root.next.next = tail;root.next = a;}
}
时间复杂度:会将每个节点处理一遍。复杂度为 O(n)
空间复杂度:O(1)
直接看代码可能会比较懵,我们结合图解来看。
假设当前样例为 1->2->3->4->5->6->7
和 k = 3
:
然后我们调用 reverse(cur, k)
,在 reverse()
方法内部,几个指针的指向如图所示,会通过先判断 cur
是否为空,从而确定是否有足够的节点进行翻转:
然后先通过 while
循环,将中间的数量为 k - 1
的 next 指针进行翻转:
最后再处理一下局部的头结点和尾结点,这样一次 reverse(cur, k)
执行就结束了:
回到主方法,将 cur
往前移动 k
步,再调用 reverse(cur, k)
实现 k
个一组翻转:
…
最后
这是我们「刷穿 LeetCode」系列文章的第 No.25
篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先将所有不带锁的题目刷完。
在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。
由于 LeetCode 的题目随着周赛 & 双周赛不断增加,为了方便我们统计进度,我们将按照系列起始时的总题数作为分母,完成的题目作为分子,进行进度计算。当前进度为 25/1916
。
为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:Github 地址 & Gitee 地址。
在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和一些其他的优选题解。
#算法与数据结构
#LeetCode题解
#算法面试
【每日算法/刷穿 LeetCode】25. K 个一组翻转链表(困难)相关推荐
- Leetcode 25 K个一组翻转链表 (每日一题 20210719)
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表.k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序.进阶:你可以设计一个只 ...
- LeetCode 25. K 个一组翻转链表
https://leetcode-cn.com/problems/reverse-nodes-in-k-group/ 难度:困难 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. ...
- Leetcode 25.K个一组翻转链表
难度:困难 频率:185 **题目:**给你一个链表,每K个节点一组进行翻转,清你返回翻转后的链表. K是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是K的整数倍,那么请将最后胜于的节点保 ...
- 28. Leetcode 25. K 个一组翻转链表 (链表-反转链表)
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序.进阶:你可以设计一 ...
- LeetCode 25 K个一组翻转链表
https://leetcode-cn.com/problems/reverse-nodes-in-k-group/ 解决方案 class Solution {public ListNode reve ...
- java 最长回文_【Java】【每日算法/刷穿 LeetCode】5. 最长回文子串(中等)
首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]5. 最长回文子串(中等) 宫水三叶发布于 今天 12:00 题目描述 给你一个字符串 s,找到 s 中最长的回文子串. 示例 ...
- java回文数算法for_【Java】【每日算法/刷穿 LeetCode】9. 回文数(简单)
首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]9. 回文数(简单) 宫水三叶发布于 今天 15:30 题目描述 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从 ...
- 整数反转leetcode java_【Java】【每日算法/刷穿 LeetCode】7. 整数反转(简单)
首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]7. 整数反转(简单) 宫水三叶发布于 今天 12:10 题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数 ...
- java编写字母z算法_【Java】【每日算法/刷穿 LeetCode】6. Z 字形变换(中等)
首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]6. Z 字形变换(中等) 宫水三叶发布于 今天 12:03 题目描述 将一个给定字符串 s 根据给定的行数 numRows , ...
- 25. K 个一组翻转链表
25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...
最新文章
- lenovo电脑_联想推出了其最新的ThinkBook笔记本电脑产品ThinkBookPlus
- php登陆验证码错误,DEDE织梦后台登陆提示验证码错误的方法
- 高通平台msm8909 LK 实现LCD 兼容
- 最简单最详细的SpringBoot入门项目——HelloWorld
- LinuxMint(Ubuntu)安装文泉驿家族黑体字
- 三十七、Redis和MongoDB基本语法
- elementui 搭建布局页面路由_【项目实践】使用Vue.js和ElementUI快速实现后台管理系统的界面布局...
- The response status was 0. Check out the W3C XMLHttpRequest Level 2 spec for
- 一个基础的 HTML 文档有哪些标签?(3)
- 机器学习中的数学--数学知识复习
- EasyUI中取的DataGrid中选中行数据
- STM32F407 独立看门狗 个人笔记
- Softmax回归概论
- 计算机应用基础讨论,计算机应用基础讨论
- App开发外包给专业软件开发公司,需要注意什么?
- php 世界时间,PHP 时区列表[时差]
- 【易语言】微信跳一跳教程详细版,分分钟让新手学会的教程(附源码)
- 有趣的 Kotlin 0x02:Indent trimming
- 重新定义“车规级”激光雷达
- uvm_objection/uvm_objection_events/test_done_objection/callbacks_objection/objection_callback