题目描述

给你一个链表,每 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->7k = 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 个一组翻转链表(困难)相关推荐

  1. Leetcode 25 K个一组翻转链表 (每日一题 20210719)

    给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表.k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序.进阶:你可以设计一个只 ...

  2. LeetCode 25. K 个一组翻转链表

    https://leetcode-cn.com/problems/reverse-nodes-in-k-group/ 难度:困难   给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. ...

  3. Leetcode 25.K个一组翻转链表

    难度:困难 频率:185 **题目:**给你一个链表,每K个节点一组进行翻转,清你返回翻转后的链表. K是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是K的整数倍,那么请将最后胜于的节点保 ...

  4. 28. Leetcode 25. K 个一组翻转链表 (链表-反转链表)

    给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序.进阶:你可以设计一 ...

  5. LeetCode 25 K个一组翻转链表

    https://leetcode-cn.com/problems/reverse-nodes-in-k-group/ 解决方案 class Solution {public ListNode reve ...

  6. java 最长回文_【Java】【每日算法/刷穿 LeetCode】5. 最长回文子串(中等)

    首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]5. 最长回文子串(中等) 宫水三叶发布于 今天 12:00 题目描述 给你一个字符串 s,找到 s 中最长的回文子串. 示例 ...

  7. java回文数算法for_【Java】【每日算法/刷穿 LeetCode】9. 回文数(简单)

    首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]9. 回文数(简单) 宫水三叶发布于 今天 15:30 题目描述 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从 ...

  8. 整数反转leetcode java_【Java】【每日算法/刷穿 LeetCode】7. 整数反转(简单)

    首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]7. 整数反转(简单) 宫水三叶发布于 今天 12:10 题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数 ...

  9. java编写字母z算法_【Java】【每日算法/刷穿 LeetCode】6. Z 字形变换(中等)

    首页 专栏 java 文章详情 0 [每日算法/刷穿 LeetCode]6. Z 字形变换(中等) 宫水三叶发布于 今天 12:03 题目描述 将一个给定字符串 s 根据给定的行数 numRows , ...

  10. 25. K 个一组翻转链表

    25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...

最新文章

  1. lenovo电脑_联想推出了其最新的ThinkBook笔记本电脑产品ThinkBookPlus
  2. php登陆验证码错误,DEDE织梦后台登陆提示验证码错误的方法
  3. 高通平台msm8909 LK 实现LCD 兼容
  4. 最简单最详细的SpringBoot入门项目——HelloWorld
  5. LinuxMint(Ubuntu)安装文泉驿家族黑体字
  6. 三十七、Redis和MongoDB基本语法
  7. elementui 搭建布局页面路由_【项目实践】使用Vue.js和ElementUI快速实现后台管理系统的界面布局...
  8. The response status was 0. Check out the W3C XMLHttpRequest Level 2 spec for
  9. 一个基础的 HTML 文档有哪些标签?(3)
  10. 机器学习中的数学--数学知识复习
  11. EasyUI中取的DataGrid中选中行数据
  12. STM32F407 独立看门狗 个人笔记
  13. Softmax回归概论
  14. 计算机应用基础讨论,计算机应用基础讨论
  15. App开发外包给专业软件开发公司,需要注意什么?
  16. php 世界时间,PHP 时区列表[时差]
  17. 【易语言】微信跳一跳教程详细版,分分钟让新手学会的教程(附源码)
  18. 有趣的 Kotlin 0x02:Indent trimming
  19. 重新定义“车规级”激光雷达
  20. uvm_objection/uvm_objection_events/test_done_objection/callbacks_objection/objection_callback

热门文章

  1. mac 卸载 mysql_Mac OS X苹果系统中怎么将mysql完全卸载掉
  2. C++实现的银行账户管理系统
  3. 如何轻松找到竞品独立站?竞品独立站搜罗神器曝光!
  4. 仿射密码python_仿射密码加解密 python
  5. 表白失败,还是好好写程序吧
  6. 基于jwt的登录验证
  7. idea 调试 maven plugin 源码
  8. 35岁人到中年,想转行做自媒体或短视频方向,有什么建议?
  9. Jenkins自动部署-GitHub
  10. ECharts-地图