前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >递归 | K个一组反转链表

递归 | K个一组反转链表

作者头像
五分钟学算法
发布2021-03-10 10:51:03
3400
发布2021-03-10 10:51:03
举报
文章被收录于专栏:五分钟学算法

今天分享的内容是LeetCode #25 K个一组反转链表这个题目,详细内容如下:

题目描述:

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

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

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

示例:

代码语言:javascript
复制
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5


思路分析:
在

在这里我们以k=2为一组进行链表反转。因此,在除去前2个节点后,nextHead指向节点3。在经过reverseKGroup(nextHead,2)递归反转后,链表结构如下图所示。注意在这里,不要试图去在大脑中复现reverseKGroup这个递推公式的调用过程,只需知道其执行后的结果就可以了。

到此,我们完成了除去前2个节点之后,剩余节点的反转。接着要做的是反转前k=2个节点。反转后结果如下图所示:

这时,只需将head的后继指针指向变量subList所指向的节点,就完成了K个一组反转链表这个任务。

在加上反转链表中前k个节点的代码后,代码进一步完善如下: public ListNode reverseKGroup(ListNode head, int k) { // nextHead指向链表中除去k个节点之后的头节点 // 初始指向节点head ListNode nextHead = head; // 链表中剩余节点个数 int remainNum = 0; while (remainNum < k){ // 根据题意如果链表剩余节点个数不足k个 // 则不需要反转,因此直接返回head if (nextHead == null) { return head; } remainNum++; nextHead = nextHead.next; } // 递归反转链表中除去前k个节点的后续节点 ListNode subList = reverseKGroup(nextHead,k); // 反转链表中前k个节点 ListNode newHead = reverseTopN(head, k); // 前k个节点反转后,head指向的节点是反转后的链表中的最后一个节点 // 因此head指向的节点的后继指针指向subList head.next = subList; return newHead; } 最后我们看下如何反转链表中的前K个节点。动画演示如下: 反转前K=2个节点 反转前K个节点的代码实现如下: private ListNode reverseTopN(ListNode head, int n) { ListNode prev = null; // 当前考察的节点 ListNode cur = head; // num小于n,则表示当前节点需要反转 for(int num = 0; num < n; num++){ // 当前节点的下一个节点 ListNode next = cur.next; // 当前节点的后继指针指向prev cur.next = prev; // prev指向当前节点 // 表示其是next节点反转后的前一个节点 prev = cur; // cur指向下一个节点 // 表示下一个节点是待反转节点 cur = next; } return prev; } 今天的分享就到这里了 如有错误 欢迎在公众号后台留言指出 下一篇我们将学习新的内容,敬请期待

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 五分钟学算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档