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

25. K 个一组翻转链表

题目

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

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

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

代码

先数结点数,然后使用for循环控制每一组的反转。
以下是p1和p2分别指向第一个和第二个有值的结点,但是for循环中这样写会导致p2可能为空,所以后面p2赋值时,要加判断if(p2)。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
private:int n = 0;
public:ListNode* reverseKGroup(ListNode* head, int k) {ListNode* p = head;while(p) {n++;p = p->next;}ListNode *fake = new ListNode();fake->next = head;ListNode *p1 = head, *p2 = head->next; //p2 maybe nullListNode *l = fake;for (int j = n; j >= k; j-=k) {ListNode* cur_l = l->next;for (int i = 0; i < k-1; i++) {ListNode* r = p2->next;p2->next = p1;p1 = p2;p2 = r;}l->next = p1;cur_l->next = p2;l = cur_l;p1 = p2;if (p2) {p2 = p2->next;}}return fake->next;}
};

更好的写法,参考灵茶山艾府题解(但比其用的指针少),先给一个nullptr作为p1,p2是第一个有值结点,这样多赋值一次(for循环多走一次),但是for循环不用担心p2越界。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
private:int n;
public:ListNode* reverseKGroup(ListNode* head, int k) {ListNode *p = head;while(p) {n++; p = p->next;}ListNode *fake = new ListNode();fake->next = head;ListNode *ll = fake;ListNode *l = nullptr; p = head;for (int j = n; j >= k; j-=k) {ListNode* cur_l = p;ListNode* r;for (int i = 0; i < k; i++) {r = p->next;p->next = l;l = p;p = r;}ll->next = l;cur_l->next = r;ll = cur_l;}return fake->next;}
};

一般我习惯*r指向下一个要用到的结点。因为上一个结点的next改变后,下一个结点需要记录才能找得到,所以用*r来记录,一般可以是局部变量写到for循环内部,但是这个题由于cur_l->next = r这行还要用到*r,所以ListNode* r;定义到for前面。

http://www.jsqmd.com/news/554634/

相关文章:

  • 3分钟掌握Magika:AI驱动的文件类型检测终极指南
  • Arduino与单片机技术入门及实践指南
  • BGE M3-Embedding:揭秘统一多语言、多功能、多粒度检索的‘三合一’模型
  • 分析浙江BWT倍世家用净水器,价格费用如何及选购要点 - 工业品牌热点
  • 2026年食品/土壤检测仪器推广:垂直渠道深度解析与市场展望 - 品牌推荐大师
  • EEVDF调度器完全调优指南:从lag公式推导到place_entity()参数配置
  • usearch的代码注释规范:提高代码可读性的实践
  • STM32G030驱动无刷电机:从寄存器配置到PWM波形生成的保姆级避坑指南
  • 基于MATLAB的单闭环直流调速系统设计探索
  • lite-avatar形象库实战教程:用50+职业数字人打造垂直领域AI对话助手
  • INMS: Memory Sharing for Large Language Model based Agents 论文笔记
  • InternLM2-Chat-1.8B在复杂网络问题诊断中的辅助应用
  • 显卡性能调优:从系统瓶颈到高效GPU资源分配的完整指南
  • bilibili-api用户认证详解:SESSDATA、BILI_JCT、BUVID3等参数获取全攻略
  • 内存故障排查终极指南:Memtest86+从入门到精通
  • GPU显存暴涨300%却查不到泄漏点?Cuvil IR可视化调试器首次公开:3分钟定位Python模型编译期内存幻影引用
  • BERT实践指南:从理论到应用的自然语言处理技术
  • VS2022 Fortran 集成IMSL库实战指南
  • BERT终极使用指南:5分钟掌握自然语言处理核心技术
  • 浙江BWT倍世家用净水器性价比高吗,值得推荐吗 - 工业推荐榜
  • 毕设程序java高校辅导员工作管理系统 基于SpringBoot的高校学生事务协同管理平台设计与实现 基于Java的高校学工一体化服务系统开发与应用
  • ai+实现pytest框架讲解(2)
  • 总结全国好用的多元素分析仪品牌,哪家值得推荐? - mypinpai
  • 3.29
  • Win11+VS2022下Ceres库安装全攻略:从源码编译到避坑指南
  • Fun-ASR语音识别新手入门:环境配置+Web服务启动,10分钟搞定
  • 资源下载器:突破平台限制的全场景网络资源获取解决方案
  • # 发散创新:用 Rust构建高性能 Web3.0 智能合约验证器
  • 组合式API如何重塑Vue管理系统开发?探索3大架构升级与实践路径
  • 2026年广西云南等地防潮通信设备工厂排名,这些品牌值得关注 - myqiye