注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路。

描述

给你一个链表,每 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]

解题思路

这道题虽然是困难题,只是在各种边界条件和示例中需要考虑很多,其核心思想就是:

  1. 按照 k 拆分链表为若干组
  2. 将每一组链表进行翻转
  3. 将翻转后的每一组链表进行重链接

本人使用了一个数组nodes存放了每一组链表的头节点

var reverseKGroup = function(head, k) {// k 为 1, 无需任何操作,直接返回 head 即可if(k === 1) return head// 用于分组的计数节点let count = 0let p = headlet nodes = []// 保存每组链表头节点在给定链表中的上一个节点let pre = null// 每一组链表的头节点let start = head// 保存 不足 k 个长度的那组链表let tail = null// 开始分组while(p !== null){count ++pre = pp = p.next// 当前子链表长度为 k 的时候if(count === k){// 把这个子链表的头节点放到 nodes 中nodes.push(start)count = 0// 将这个链表的头节点,与其上一个节点断开链接pre.next = null// 更新 start 为当前的 p 所指向的节点start = p}// p === null 时, 使用 tail 记录剩余部分的子链表的头节点// !!! 末尾不足 k 长度的链表并没有保存到 nodes 中if(p === null) tail = start}// 对每个子链表逆序nodes = nodes.map(item => reserveList(item))// 合并子链表for(let i = 0, len = nodes.length; i < len; i++){let p = nodes[i]// 找到当前子链表的最后一个节点,存在 p 中while(p.next !== null) p = p.next// i + 1 < len, 说明其后面还有其他子链表,// 将当前子链表的最后一个节点和下一个子链表的头节点相链接if(i + 1 < len) p.next = nodes[i + 1]// i + 1 >= len, 说明其后面没有长度为 k 的子链表了// 直接将长度不足 k 的部分追加即可else p.next = tail}// 直需要返回第一个子链表的头节点即可return nodes[0]
};

链表逆序部分的思路可以参考这篇文章 剑指 Offer II 024. 反转链表

// 链表逆序函数
var reserveList = head => {let p = headlet newHead = nullwhile(p !== null){const temp = p.nextp.next = newHeadnewHead = pp = temp}return newHead
}

力扣题目——25. K 个一组翻转链表相关推荐

  1. Leetcode-递归/反转链表模板-25. K 个一组翻转链表

    题目25. K 个一组翻转链表: 题解: 模拟 以K个为一组,进行常规反转,重点是要保留反转前的头节点,以及第K+1个节点,将其反转之后连接起来 代码: /*** Definition for sin ...

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

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

  3. 【每日算法/刷穿 LeetCode】25. K 个一组翻转链表(困难)

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

  4. 力扣 25. K 个一组翻转链表

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

  5. leetcode C++ 25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

    一.思路: 先实现两个节点翻转,再实现k个节点翻转,最后实现一组一组翻转 二.C++代码: class Solution { public:ListNode* swap(ListNode *f1, L ...

  6. leetcode 25. Reverse Nodes in k-Group | 25. K 个一组翻转链表(Java)

    题目 https://leetcode.com/problems/reverse-nodes-in-k-group/ 题解 乍一看以为很容易:每 k 个节点翻转,若剩余不足 k 个,则不变.没有什么技 ...

  7. 每隔k次反转一次 链表_leetcode 25 K个一组翻转链表(c++)

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

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

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

  9. 【LeetCode笔记】25. K个一组翻转链表(Java、链表、递归)

    文章目录 题目描述 思路 & 代码 更新 - 精简版 三刷 - 再更新版 题目描述 审题很重要..一开始以为是一组换两个,但是实际上是一组全部都要互换. 字节超高频题!要认真点记录 思路 &a ...

最新文章

  1. 观《超能陆战队》未来的“机器人设计师”的必备装备
  2. RGBD 转换成点云 open3d
  3. 背景建模与前景检测2(Background Generation And Foreground Detection Phase 2)
  4. 用javascript 禁止右键,禁止复制,禁止粘贴
  5. find指定具体时间参数-newermt
  6. 《深入剖析NGINX》学习记录
  7. 线程NEW状态和RUNNABLE状态
  8. EXP 导出出错解决方案
  9. 《统计学习方法》—— 感知机原理、推导以及python3代码实现(一)
  10. html css 圆形按钮 仿uc,10款基于jquery的web前端动画特效
  11. Vue知识点笔记(基础篇)
  12. java中average方法_Java中的IntStream average()方法
  13. python3中aiohttp+asyncio 高效率爬取图片例子,本地保存
  14. 什么是百度搜索排名规则?百度排名怎么批量查询?
  15. setsockopt和getsockopt函数
  16. Nginx 搭建RTMP视频点播 直播 HLS服务器
  17. 会话初始协议---SIP协议【详解】
  18. JS实现可拖拽div
  19. 广角相机app哪个比较好用_有哪些好看的手机拍照软件?
  20. C++怎么判断windows系统是64位还是32位

热门文章

  1. python实现项目的复制_python实现复制大量文件功能
  2. zabbix 5.0所有依赖包_Zabbix“专家坐诊”第82期问答汇总
  3. Win 7 下IE 的cookie 以及 Favorites 地址
  4. CentOS7.x编译安装nginx,实现HTTP2
  5. 一张图11招学会Python网络黑客
  6. mysql性能分析之explain的用法
  7. c#Code Contracts代码协定
  8. sqlyog通过跳板机ssh连接mysql数据库
  9. android studio发布版和测试版证书SHA1获取
  10. 云上持续交付实践系列1 --- java 篇