清晰易懂的“K个一组翻转链表”解法
题目来源: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执行在处理完的序列的末尾:
- 首先需要将curhead的next指针置为NULL,即断可处理完的序列和未处理完的序列之间的连接。
- 同时使用rear指针指向p指向的后一个结点。
- 然后逐一的将从pre到p的全部结点取下来,取下的结点用curp指向,然后插入到curhead结点相邻的下一个位置。(插入的方法
curp->next = curhead->next; curhead->next = curp
) - 通过步骤三的操作就可以完成将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个一组翻转链表”解法相关推荐
- 【Java】【leetcode第25题】K 个一组翻转链表
文章仅供自己学习记录所用,若有侵权.联系我删除! 接着来个链表题(听说字节考了) [K 个一组翻转链表] 其实这道题是206题和24题结合的一个进阶版本,我觉得关键就是控制范围(反正我自己折磨了很久, ...
- 链表经典题:K个一组翻转链表
题目: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这 ...
- 25. K 个一组翻转链表
25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...
- 20200329:K 个一组翻转链表(leetcode25)
K 个一组翻转链表 题目 思路与算法 代码实现 复杂度分析 题目 思路与算法 注意题目里的常数的额外空间的要求,意味着不可以使用栈之类的数据结构. 这道链表题实际就是上一道的进阶版,指定每k个进行翻转 ...
- LeetCode--第25题K个一组翻转链表
LeetCode–第25题K个一组翻转链表 题目描述 解决方案–C语言 主体是用递归的办法.递归三要素: 1.向上返回什么:一个处理好的子链表 2.返回条件是什么:要么是处于好了子链表,要么是因长度小 ...
- 哔哩哔哩2020校园招聘 - K个一组翻转链表 一年中的第几天
1.K个一组翻转链表 题目描述: 给你一个链表,每 k 个节点一组进行翻转,请返回翻转后的链表. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序. 示例 : 给定这个链表:1-&g ...
- K 个一组翻转链表(递归,Kotlin)
25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...
- 由力扣K 个一组翻转链表到360原创题
前段时间帮对象做360笔试题时,遇到一个没怎么想明白的编程题,直到今天刷力扣遇到了相似的k个一组翻转链表后,想着在做一下那天的编程题,就想着记录一下遇到的难点. 力扣题如下图所示: 360原创题如下: ...
- Leetcode-递归/反转链表模板-25. K 个一组翻转链表
题目25. K 个一组翻转链表: 题解: 模拟 以K个为一组,进行常规反转,重点是要保留反转前的头节点,以及第K+1个节点,将其反转之后连接起来 代码: /*** Definition for sin ...
最新文章
- Python学习之While语句小游戏
- minhash pyspark 源码分析——hash join table是关键
- springmvc处理流程
- JS 创建对象(常见的几种方法)
- windows如何访问linux系统文件,如何从 Windows 访问 Linux 文件?——方法步骤
- 算法导论——DFS深度优先搜索
- Win32页上的所有控件属性与方法
- 第八十八期:4000万程序员最爱开源项目和编程语言排名出炉!
- nginx分割日志管理
- C#上传文件的一个实现
- Python如何运行.ipynb文件并将其转化为.py文件
- 荣耀路由器外界硬盘与win10
- day048:LocalDateTime中增加、减少、直接修改时间的方法、计算时间间隔的方法
- 电脑自动跳出计算机管理员登陆界面,解决运行wegame总是弹出用户账户控制界面的方法...
- 阿里企业邮箱:密码登录
- redit mysql_【Voten】基于Laravel实现的类似Reddit的实时社交论坛系统
- Window XP驱动开发(二) 环境搭建(VS2008+WDK+DDKWzard)及示例源码分析
- 云速建站配置https证书
- windows10系统设置选项里没有触摸板选项
- 校准plc模拟量输入模块有什么方法
热门文章
- 风场可视化:风场数据
- 25 个精美的手机网站模板
- 常见的爬虫error以及解决方法
- 伯禹-公益AI学习打卡 Task02
- 设计一个形状类(接口)Shape,方法:求周长和求面积
- 组合数学4-全排列生成算法
- [Error] ADC.SchDoc Compiler Net NetU1_AD1_14 contains floating input pins (Pin U1_AD1-14) 19:27:
- 用Visio画深度学习模型矢量图
- 打开PDF文件时,出现“打开本文档时发生错误。无法找到本文件。”解决办法,亲自尝试成功
- volo拉丁语_拉丁语:Latin Quotes and Phrases (V)