题目来源:Leetcode K个一组翻转链表

一.题目

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

示例:

给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5

说明:

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

二.解题核心思路

要想解决该问题需要解决如下几个问题:

  • 寻找到K个一组结点(存在时);
  • 如何能够将当前一组逆序后连接到之前“逆序处理”好的序列后面,以及将当前一组逆序结点的末尾连接未经处理的链表结点序列。

2.1.如何寻找K个一组结点

  • 可采用双指针法,这里利用两个指针pre和p,其中pre用来指向K个结点的开头,p用来指向K个结点的末尾。
  • 开始时pre和p同时指向同一个结点,然后移动p到第k个结点处,若在移动过程中结点p为变为空则说明剩余的结点数少于K个,此时说明原链表已经处理完毕。

伪代码

pre = p = start_position //start_position开始寻找K个一组节点的第一个结点位置
for i = 1 to kp = p->next;if p is NULLbreak

2.2.逆序连接

2.2.1.处理步骤

在介绍之前首先说明一些使用到的指针(pre和p上面已经介绍):

  • curhead:指向已经经过处理的部分序列的末尾;
  • rear:用来保存p指针之后的序列,防止其丢失;
  • curp:用来暂时指向从k个一组结点中取出来的结点;

设之前已经翻转了几组数据,此时curhead执行在处理完的序列的末尾:

  1. 首先需要将curhead的next指针置为NULL,即断可处理完的序列和未处理完的序列之间的连接。
  2. 同时使用rear指针指向p指向的后一个结点。
  3. 然后逐一的将从pre到p的全部结点取下来,取下的结点用curp指向,然后插入到curhead结点相邻的下一个位置。(插入的方法curp->next = curhead->next; curhead->next = curp
  4. 通过步骤三的操作就可以完成将pre到p的结点序列逆序连接,然后curhead要移动到新处理完的序列的末尾结点位置,然后将rear指向的剩下的序列连接在其后面。

2.2.2.逆序连接算法图示

设K = 3,原始元素列表为1->2->3->4->5->6->7,则经过一次处理后的链表如下图所示

第二次处理第一步:将处理好的序列与未处理的序列断开,并将p的后一结点用rear指向

第二次处理第二步:从K个一组序列取出第一个结点,连接到与curhead相邻的下一位置

第二次处理第三步:取出第二个结点,连接到curhead相邻的下一位置

第二次处理第四步:取出最后一个结点,连接到curhead相邻的下一位置

第二次处理第五步:将curhead指针移动至当前已处理序列的末尾,并将未处理的指针序列连接在其后,然后重新初始化pre和p进行下一次处理

三.核心代码(C语言)

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode* reverseKGroup(struct ListNode* head, int k) {struct ListNode* pre, * p;struct ListNode *rear, * curhead,*curp;int i;curhead = (struct ListNode*)malloc(sizeof(struct ListNode));pre = p = head;while (p){for (i = 1; i < k; i++){if (!p)break;p = p->next;}if (p){rear = p->next;curhead->next = NULL;if (pre == head)head = curhead;while (pre != rear){curp = pre;pre = pre->next;curp->next = curhead->next;curhead->next = curp;}while (curhead->next){curhead = curhead->next;}curhead->next = rear;p = pre;}}return head->next;}

清晰易懂的“K个一组翻转链表”解法相关推荐

  1. 【Java】【leetcode第25题】K 个一组翻转链表

    文章仅供自己学习记录所用,若有侵权.联系我删除! 接着来个链表题(听说字节考了) [K 个一组翻转链表] 其实这道题是206题和24题结合的一个进阶版本,我觉得关键就是控制范围(反正我自己折磨了很久, ...

  2. 链表经典题:K个一组翻转链表

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

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

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

  4. 20200329:K 个一组翻转链表(leetcode25)

    K 个一组翻转链表 题目 思路与算法 代码实现 复杂度分析 题目 思路与算法 注意题目里的常数的额外空间的要求,意味着不可以使用栈之类的数据结构. 这道链表题实际就是上一道的进阶版,指定每k个进行翻转 ...

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

    LeetCode–第25题K个一组翻转链表 题目描述 解决方案–C语言 主体是用递归的办法.递归三要素: 1.向上返回什么:一个处理好的子链表 2.返回条件是什么:要么是处于好了子链表,要么是因长度小 ...

  6. 哔哩哔哩2020校园招聘 - K个一组翻转链表 一年中的第几天

    1.K个一组翻转链表 题目描述: 给你一个链表,每 k 个节点一组进行翻转,请返回翻转后的链表. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序. 示例 : 给定这个链表:1-&g ...

  7. K 个一组翻转链表(递归,Kotlin)

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

  8. 由力扣K 个一组翻转链表到360原创题

    前段时间帮对象做360笔试题时,遇到一个没怎么想明白的编程题,直到今天刷力扣遇到了相似的k个一组翻转链表后,想着在做一下那天的编程题,就想着记录一下遇到的难点. 力扣题如下图所示: 360原创题如下: ...

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

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

最新文章

  1. Python学习之While语句小游戏
  2. minhash pyspark 源码分析——hash join table是关键
  3. springmvc处理流程
  4. JS 创建对象(常见的几种方法)
  5. windows如何访问linux系统文件,如何从 Windows 访问 Linux 文件?——方法步骤
  6. 算法导论——DFS深度优先搜索
  7. Win32页上的所有控件属性与方法
  8. 第八十八期:4000万程序员最爱开源项目和编程语言排名出炉!
  9. nginx分割日志管理
  10. C#上传文件的一个实现
  11. Python如何运行.ipynb文件并将其转化为.py文件
  12. 荣耀路由器外界硬盘与win10
  13. day048:LocalDateTime中增加、减少、直接修改时间的方法、计算时间间隔的方法
  14. 电脑自动跳出计算机管理员登陆界面,解决运行wegame总是弹出用户账户控制界面的方法...
  15. 阿里企业邮箱:密码登录
  16. redit mysql_【Voten】基于Laravel实现的类似Reddit的实时社交论坛系统
  17. Window XP驱动开发(二) 环境搭建(VS2008+WDK+DDKWzard)及示例源码分析
  18. 云速建站配置https证书
  19. windows10系统设置选项里没有触摸板选项
  20. 校准plc模拟量输入模块有什么方法

热门文章

  1. 风场可视化:风场数据
  2. 25 个精美的手机网站模板
  3. 常见的爬虫error以及解决方法
  4. 伯禹-公益AI学习打卡 Task02
  5. 设计一个形状类(接口)Shape,方法:求周长和求面积
  6. 组合数学4-全排列生成算法
  7. [Error] ADC.SchDoc Compiler Net NetU1_AD1_14 contains floating input pins (Pin U1_AD1-14) 19:27:
  8. 用Visio画深度学习模型矢量图
  9. 打开PDF文件时,出现“打开本文档时发生错误。无法找到本文件。”解决办法,亲自尝试成功
  10. volo拉丁语_拉丁语:Latin Quotes and Phrases (V)