https://leetcode-cn.com/problems/reverse-nodes-in-k-group/

难度:困难


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

  k 是一个正整数,它的值小于或等于链表的长度。

  如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

  示例:

  给你这个链表:1->2->3->4->5

  当 k = 2 时,应当返回: 2->1->4->3->5

  当 k = 3 时,应当返回: 3->2->1->4->5

  说明:

  • 你的算法只能使用常数的额外空间。
  • 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

链表翻转

  首先我们需要知道单次链表翻转是如何操作的,以链表 1->2->3->null 为例:

迭代版本

  1、preptemp 指针指向如下:

  2、将p.next 指向 prepre 赋值为 pp 赋值为 temp,而 temp == p.next

  3、接下来重复步骤 2,将 p.next 指向 pre,并不断更新 prep 的指向,直到 pnull ,最后 pre 即为头结点。

JS 代码如下:

function ReverseList(pHead) {let pre = null, p = pHead;let temp;while (p) {temp = p.next;p.next = pre;pre = p;p = temp;}return pre;
}

递归版本

  同样,以链表 1->2->3->null 为例:

  要完成链表反转,我们需要将原先的尾节点作为新的头结点,因此递归边界是最后一个节点(head.next === null),对于遍历到的其他节点,我们需要将其下一个节点的指向反转:head.next.next = head,并将其断链,形成一条新的反向的链表:head.next = null

  接下来,函数返回,head 指向 1,重复以上操作,完成链表反转。

JS代码:

function ReverseList(pHead) {const helper = head => {if (!head || !head.next) {return head;}let pre = helper(head.next);head.next.next = head;head.next = null;return pre;};return helper(pHead);
}

解法1:

  为了实现每 k 个节点进行一次反转,我们可以这样做:

  遍历链表,head 表示当前遍历到的节点,变量 start 记录每一段需要反转链表的起始节点,变量 count 计算当前遍历的节点个数,每当 countk 时,对 start - head 的这段链表进行反转,count 恢复为 0

  这题的反转操作不难,难点在于每次反转后节点间的断链连接

  假设链表 1->2->3->4->5k = 21->2 段已反转完毕(2->1->3->4->5),现在需要反转 3->4 段:

  第一个断链连接操作3->4 段中的 3 会变成该段中的尾节点,需要连接上下一段的头结点:5

  第二个断链连接操作: 上一段的尾节点 1 需要和当前段的新的头结点 4 连接。

JS 代码:

var reverseKGroup = function(head, k) {if (k < 2) {return head;}let res, pre;// 反转 k 个节点, next 为第一个断链连接操作中的 下一段的头结点const flip = (head1, next, n) =>{let pre = next, p = head1;while (n--) {let temp = p.next;p.next = pre;pre = p;p = temp;}};let count = 0;let start;while (head) {if (count === 0) {start = head;  // 记录每段的起始结点}count++;if (count === k) { // 每当遍历了 k 个节点时if (pre) { // 除了第一段外,其余段需要进行第二个断链连接操作pre.next = head;}if (!res) {res = head;}pre = start;head = head.next;flip(start, head, k);count = 0;} else {head = head.next;}}return res;
};

LeetCode 25. K 个一组翻转链表相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. python中如何判断两个字符串是否相等_python怎样判断两个字符串是否相同
  2. 用Unity和Playmaker创建一个限时游戏 Creating a Time Limit game with Unity and Playmaker
  3. 如何用赌场风云解释隐马尔可夫模型(HMM)?
  4. 推动大数据和AI应用场景的落地,加速实现与产业融合。
  5. frame,iframe,frameset用法和区别
  6. shell实例第8讲:seq命令
  7. 【Python】KNN简单的判别预测
  8. 在虚拟机装一个linux系统
  9. html图片自动切换的幻灯片效果的,js带点自动图片轮播幻灯片特效代码分享
  10. 50道 JavaScript 经典面试题汇总篇
  11. 20165221 JAVA第四周学习心得
  12. 读书笔记——5建造者模式(转)
  13. 【背包问题】基于matlab遗传算法求解背包问题【含Matlab源码 578期】
  14. [置顶] 龙芯2f笔记本- openbsd5.4安装手记
  15. postgres 坐标_用postgreSQL做基于地理位置的app(zz)
  16. 计算机网络 之 P2P架构
  17. pycharm:Updating Indices 解决办法
  18. 知识图谱数据管理:存储与检索
  19. isAssignableFrom方法的功能简介说明
  20. 4.Eclipse中使用SVN

热门文章

  1. ntoskrnl损坏
  2. 如何保证MySQL和Redis的数据一致性?10张图带你搞定!
  3. 出身农村,大专学历!大厂程序员站错队被架空,想离职,被媳妇拿离婚威胁,好死不如赖活着!...
  4. 五大分布式事务,你了解多少?
  5. 骂战之后,天才王垠或将加入华为,赵海平怒离职,加入字节跳动!
  6. 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  7. 微服务治理实践:服务查询
  8. 分布式事务选型的取舍
  9. Elasticsearch如何做到亿级数据查询毫秒级返回?
  10. android8.1内核编译,Android8.1.0安卓源码编译