当前位置: 首页 > news >正文

每日一练:K个一组翻转链表

25. K 个一组翻转链表 - 力扣(LeetCode)

一、题目要求

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

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

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

示例 2:

输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]

提示:

  • 链表中的节点数目为 n
  • 1 <= k <= n <= 5000
  • 0 <= Node.val <= 1000

进阶:你可以设计一个只用 O(1) 额外内存空间的算法解决此问题吗?

二、解法1-双层递归 O(N) 进阶

        这个题与翻转链表(每日一练:反转链表-CSDN博客)类似,但是它是分成了几个组分别进行反转,反转链表时我们使用递归来完成,这个题我们很容易想到把链表分层几部分分别递归,但是难点在于各个部分反转后还需要进行连接,这就又需要一层递归,即:

        先递归(外层递归)到最后一个要进行反转的部分,进行递归反转(内层递归)后,得到它的新头后返回上一层递归(外层递归);上一层递归是前一个要进行反转的部分,这部分又进行递归反转后将新尾连接到上一次返回的新头即可

        新头就是旧尾,要返回给调用它的上一次函数,也就是链表的前一部分。

        新尾就是旧头,我们可以在外层递归时保存这个节点,得到后一部分的新头后指向它。

        外层递归是为了以从后向前的顺序枚举到所有需要反转的组;

        内存递归就是为了翻转这些组;

class Solution {ListNode* __reverseKGroup(ListNode* last, ListNode* cur, int k) { // 内层递归if (k == K){cur->next = last;return cur;}ListNode* newhead = __reverseKGroup(cur, cur->next, k+1);cur->next = last;return newhead; // 返回新头}ListNode* _reverseKGroup(ListNode* cur, ListNode* head, int k) { // 外层递归if (cur == nullptr || cur->next==nullptr && k != K){return head;}if (k == K){ListNode* head_next = _reverseKGroup(cur->next, cur->next, 1); // 得到下一部分的新头以连接它ListNode* newhead = __reverseKGroup(head_next , head, 1); // 得到这部分的新头,并连接下部分的新头return newhead; // 返回这部分的新头给前一部分}return _reverseKGroup(cur->next, head, k+1);}
public:ListNode* reverseKGroup(ListNode* head, int k) {K = k;return _reverseKGroup(head, head,1);}
private:int K;
};

http://www.lryc.cn/news/437171.html

相关文章:

  • 昨晚,OpenAI震撼发布o1大模型!我们正式迈入了下一个时代。
  • MySql8.x---开窗函数
  • 图文讲解HarmonyOS应用发布流程
  • 【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)
  • 经典负载调制平衡放大器(LMBA)设计-从理论到ADS仿真
  • Web开发:基础Web开发的支持
  • 【LeetCode每日一题】——LCR 168.丑数
  • Day7 | Java框架 | SpringMVC
  • 【网络通信基础与实践第二讲】包括互联网概述、互联网发展的三个阶段、互联网的组成、计算机网络的体系结构
  • CentOS7下安装Ruby3.2.4的实施路径
  • Redis 实现原理或机制
  • 使用程序方式获取与处理MySQL表数据
  • 计算机网络(五) —— 自定义协议简单网络程序
  • 开源模型应用落地-qwen2-7b-instruct-LoRA微调-unsloth(让微调起飞)-单机单卡-V100(十七)
  • [数据集][目标检测]车油口挡板开关闭合检测数据集VOC+YOLO格式138张2类别
  • Delphi 的 RSA 库 LockBox
  • element UI学习使用(1)
  • 如何搞定日语翻译?试试这四款工具
  • 【STM32】独立看门狗(IWDG)原理详解及编程实践(上)
  • 前端框架大观:探索现代Web开发的基石
  • 16 训练自己语言模型
  • udp网络通信 socket
  • LG AI研究开源EXAONE 3.0:一个7.8B双语语言模型,擅长英语和韩语,在实际应用和复杂推理中表现出色
  • 【mysql】mysql之主从部署以及介绍
  • Invoke-Maldaptive:一款针对LDAP SearchFilter的安全分析工具
  • QT 读取Excel表
  • 深入理解 Vue 组件样式管理:Scoped、Deep 和 !important 的使用20240909
  • C语言内存函数(21)
  • 三高基本概念之-并发和并行
  • 宝塔面板FTP连接时“服务器发回了不可路由的地址。使用服务器地址代替。”