LeetCode 25 - K个一组翻转链表 - C++递归含代码

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

K个一组翻转链表 - C++ 含代码

题目LeetCode 25
给出一个链表,每 k k k 个节点一组进行翻转,返回翻转后的链表。其中 k k k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k k k 的整数倍,那么最后剩余的节点需保持原有顺序。
说明:1. 算法只能使用常数的额外空间。2. 不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

示例
对于链表 1 -> 2 -> 3 -> 4 -> 5
k = 2 k=2 k=2 时,应当返回 2 -> 1 -> 4 -> 3 -> 5
k = 3 k=3 k=3 时,应当返回 3 -> 2 -> 1 -> 4 -> 5


思路
关于这个问题,我们可以使用递归的方法。题目的目标是对链表做K个一组的翻转,直观来看,我们需要把链表从头节点开始,按K个节点一组划分成子链表,再对每个子链表进行单链表翻转,最后把这些子链表连接起来。

使用递归方法时,我们主要关注递归过程的一个单元中进行的操作。

1. 确认递归的回归条件

在本题中,递归的回归条件是当前子链表中的节点不足 k k k 个。当剩余节点不足 k k k 个时,不用进行任何操作,只需要向递归的“上级”返回原指针即可。

ListNode* reverseKGroup(ListNode* head, int k) {
	int count = 0;
	ListNode* cur = head;
	while (count < k && cur) {
		count++;
		cur = cur->next;
	}
	if (count < k) return head;
}

2. 翻转当前子链表
经过上一步确认递归的回归条件,我们的代码执行到这里满足以下三点:

(1) 当前子链表节点个数 ≥ k \geq k k
(2) 待翻转的节点为从headcur的前一个节点;
(3) cur指针指向下一个待翻转的子链表的第一个节点。

因此,在本次递归中,我们只需要对当前子链表进行翻转,并让翻转后的子链表最后一个节点的next指针指向cur即可。

原地翻转单链表需要三个辅助指针,分别为p指向当前节点、pre指向当前节点的前一个节点以及next指向当前节点的下一个节点。每一步翻转过程中,我们先使用next暂存下一个待翻转的节点,然后将p节点的next指向pre

ListNode* pre = head;
ListNode* p = head->next;
while (p != cur) {
	ListNode* next = p->next;
    p->next = pre;
    pre = p;
    p = next;
}

这一步完成后,当前子链表已经基本完成了内部的翻转,除了最后一个步骤,就是head->next目前没有发生改变。经过翻转后,head已经成为了当前子链表的最后一个节点,根据上面(3),它应该指向下一段链表,也就是cur。但是我们知道从cur开始的新一段子链表也需要做上面的每一步操作,即判断节点是否超过 k k k 个,继续翻转。。等等,这不就是递归的递推阶段吗?

3. 递归的递推阶段

因此,我们需要让本次递归的head->next指向下一段子链表翻转后的结果,至于下一次翻转是什么结果,不是本轮递归需要考虑的,我们只要交给它就行了。那么就剩下最后一个问题了,翻转后的子链表,我们需要返回它经过翻转后的新的头节点。我们回头看步骤2中的代码段,循环退出时,p == cur,也就是说,p指向了下一段子链表的开头,那么p的前一个节点pre不就正好是翻转后的新头节点吗(也就是翻转前的尾节点)。所以递归的最后一个环节我们也完成了。

head->next = reverseKGroup(cur, k);
return pre;

递归完整代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        // 递归
        // 1. Base case,递归回归条件
        int count = 0;
        ListNode* cur = head;
        while (count < k && cur) {
            count++;
            cur = cur->next;
        }
        if (count < k) return head;
        // 2. 翻转
        ListNode* pre = head;
        ListNode* p = head->next;
        while (p != cur) {
            ListNode* next = p->next;
            p->next = pre;
            pre = p;
            p = next;
        }
        // 3. 递归递推条件
        head->next = reverseKGroup(cur, k);
        return pre;
    }
};

第一次写博客,难免有不足之处,欢迎大家批评指正,共同交流进步。

LeetCode C++10-K个一组翻转链表 问题描述 给你一个链表,每k个节点一组进行翻转,请你返回翻转后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有的顺序。 举例 示例1: 输入:1->2->3->4->5 k=2 输出:2->1->4->3->5 示例2: 输入:1->2->3->4->5 k=3 输出:3->2->1->4->5 示例3: 输入:1-&... 阅读详情

相关推荐

leetcode面试经典150题】62. K 个一组翻转链表C++

本题来自【leetcode面试经典150题】62. K 个一组翻转链表C++

m0_74172965的博客 578

LeetCode25题: k个一组翻转链表

LeetCode25题: k个一组翻转链表

u011250186的博客 324

[C++] k个一组反转链表

目录例题描述解题思路代码实现 例题描述 此问题为反转单链表的引申问题之一,在单链表翻转的基础上增加一些边界控制,使链表完成k个节点一组的特殊化反转。最终返回反转后的链表头节点。 这里给出原问题链接:【反转一个单链表】https://blog.csdn.net/qq_42351880/article/details/88637387 此算法入参有两个:链表头节点、每组节点数k 示例: 输入: 1->2->3->4->5->6->NULL 如果参数k = 2, 输

giturtle's blog 1647

每日一题--LeetCode 25 (k个一组翻转链表)java

题目描述: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。 示例 : 给定这个链表:1-&gt;2-&gt;3-&gt;4-&gt;5 当 k = 2 时,应当返回: 2-&gt;1-&gt;4-&gt;3-&gt;5 当 k = 3 时,应当返回: 3-&g...

【Dyson】的博客 2413

C++ 面试高频考点 链表 迭代 递归 力扣 25. K 个一组翻转链表 每日一题 题解

本文深度拆解“K个一组翻转链表”这一链表进阶核心题,涵盖题目价值、算法原理、递归与迭代双实现及避坑指南。核心原理配合头插法翻转、组间衔接的动态GIF图,直观呈现指针变化过程,帮你快速攻克指针操作难点,两种实现的对比表更便于复习复盘。

Q741_147的博客 1097

LeetCode 算法:K 个一组翻转链表 c++

LeetCode 算法:K 个一组翻转链表 c++

世界那么大,我想去看看~【随心更新,看世界去了😄】 1539

【力扣Leetcode题解系列之0025— K 个一组翻转链表

摘要 LeetCode 25题"K个一组翻转链表"要求将链表每k个节点为一组进行翻转,剩余不足k个的节点保持原序。常用解法包括迭代法和递归法。迭代法通过创建哑节点简化边界处理,遍历链表并对每组k个节点进行反转,调整指针连接各组。递归法则将问题分解为子问题,先处理第一组k个节点,再递归处理剩余链表。本文提供了Python、Java、C和C++四种语言的实现代码,展示了如何通过指针操作实现链表分组翻转。该题考察链表操作能力,时间复杂度为O(n),空间复杂度为O(1)(迭代法)或O(n/k)(

youngerwang的博客 704

算法leetcode25. K 个一组翻转链表(rust重拳出击)

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

二当家的白帽子 1324

leetcode-25-k个一组翻转链表(c++)

写在前面 leetcode刷题笔记心得总结,原谅年纪大不总结很快就忘记的毛病… 主要目的:提升数据结构与算法能力,毕竟实际开发中可能遇到深层次的算法问题 主要收获:数据结构、算法思想(此处敲黑板) 题目描述 25. K 个一组翻转链表 源题详情,不再废话 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 说明: 算法只能使用常数的额外空间。 不能只是单纯的

kngines 682

LeetCode(C++)刷题计划:25-K个一组翻转链表

25-K个一组翻转链表 @Author:CSU张扬 @Email:csuzhangyang@gmail.com or csuzhangyang@qq.com Category Difficulty Pass rate Tags Companies algorithms Medium 72.20% linked-list facebook / microsoft 1. 题目 ...

神奇小海螺的博客 8485

LeetCode 25. K 个一组翻转链表 | 硬核拆解「reverse N」核心思路

本文详细拆解了LeetCode 25题「K个一组翻转链表」的解题思路。该题要求将链表每K个节点为一组进行翻转,不足K个的保持原序。核心解法分为两部分:通过reverseN判断是否足够K个节点,再利用__reverseN实现单组翻转。采用虚拟头节点技巧处理边界问题,配合双指针循环完成分组翻转拼接。文章包算法原理、代码实现、调试要点和复杂度分析,时间复杂度为O(n),空间复杂度O(k)。掌握该题的「reverse N」核心思路,可解决各类链表分段翻转问题。

软件科学-郝学胜 624

LeetCode25 题:K 个一组翻转链表(C++)

25. K 个一组翻转链表 - 力扣(LeetCode) 反转链表的进阶版:LeetCode第 206 题:反转链表(C++)_qq_32523711的博客-CSDN博客 链表操作的关键点在于现场保护,本题反转区间之前、之后的节点需要在反转之后连接到正确的位置。翻转是简单的部分,难点在于现场保护和恢复。 可以迭代求解也可以递归求解: 迭代的话,一次遍历就可以获取节点总个数n,n/k即为需要翻转的次数,每次翻转k个节点,需要让k-1个指针反向 递归的话,同样需要操作n/k次,定义函数reverse(node

zj 435

leetcode25.K个一组翻转链表/翻转链表

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 示例 : 给定这个链表:1->2->3->4->5 当 k = 2 时,应当返回: 2->1->4->3->5 当 k = 3 时,应当返回: 3->2-&g...

yyf_blog 469

【反转链表】【K个一组翻转链表】两个问题具体思路,文中多种解法(附完整代码

本文将围绕【反转链表】问题展开详细论述。采用【递归法】【迭代法】同时,还将进一步升级该问题,讨论【K个一组翻转链表

bufangbufang的博客 1586

Leetcode 25. K 个一组翻转链表 C++

Leetcode 25. K 个一组翻转链表 题目 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 测试样例 给你这个链表:1->2->3->4->5 当 k = 2 时,应当返回: 2->1->4->3->5 当 k = 3 时,应当返回: 3->2->1->4->5 题解 这题可以递归完成,每

weixin_43750513的博客 303

【力扣】K个一组翻转链表

给你链表的头节点 head ,每 k个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

代码兴国 520

leetcode25-K个一组翻转链表C++

题目如下: 解题思路: 同样采用 递归 来解决问题。思路类似两两交换链表中节点,先对前 K 个节点翻转,然后递归调用,递归结束的条件是当前剩余节点个数小于 K 个。 代码如下: /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; *...

qq_34018840的博客 930

leetcode题:25. K 个一组翻转链表(困难)

一、题目描述:25. K 个一组翻转链表(困难) 给你一个链表,每k个节点一组进行翻转,请你返回翻转后的链表。 k是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。 示例 : 给定这个链表:1->2->3->4->5 当k= 2 时,应当返回: 2->1->4->3-&g...

tankpanv的博客 165

LeetCode算法 —— K 个一组翻转链表

题目: 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 示例: 给你这个链表:1->2->3->4->5 当 k = 2 时,应当返回: 2->1->4->3->5 当 k = 3 时,应当返回: 3->2->1->4->5 说明: 你的算法只能使用常数的额外空间。 你不能只是单纯的改变节点内部的值,而

浪子花梦 576
下一篇: LeetCode 136 - 只出现一次的数字 - C++含思路和代码
lichenxi_0528
博客等级 码龄8年 6粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值