### 题目

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

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

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

说明 :

你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

### 思路

链表问题的要求就是思路一定要清晰,注意几个问题:
1、链表剩下的未交换节点不足k个怎么处理
2、交换过程中怎么判断已经交换结束
3、交换过程中怎么注意不要丢失节点信息
4、交换完之后怎么更新申请的辅助节点的信息

申请的是一个辅助节点auxiliary放在待交换的节点的前面,例如要交换的k(k=3)个节点为1->2->3,那就申请一个auxiliary节点放在1的前面,便于后面的交换工作,针对上面的四个问题,按照题目的意思,不足k个就不交换了,其次判断是否结束交换,判断方法是auxiliary的next节点是否是最开始的待交换节点的最后一个节点,不要丢失节点信息就只能靠自己写节点的交换顺序了,看是否能交换成功,交换结束之后,辅助节点赋值为交换的这一批节点的最后一个节点,下面就说采取的更新的方法:

假设k=4,链表为1->2->3->4->5->6->7->8->9
首先申请一个auxiliary节点指在前方,然后申请一个节点tail存储待交换k个节点的末尾,再申请一个cur节点存储下一个待交换的节点,
具体流程如下:
auxiliary->1->2->3->4->5->6->7->8->9,其中tail存储4,cur存储1,交换过程就是将1放在4的后面,然后更新cur的位置。
auxiliary->2->3->4->1->5->6->7->8->9,tail依然存储4,但是cur存储2了(这就是申请auxiliary的原因,这样可以正确的找到2的位置,只需要让cur=auxiliary->next就可以了),然后同样的,又将cur放在tail的后面,tail往前移动。
auxiliary->3->4->2->1->5->6->7->8->9,同样的道理,继续进行移动。
auxiliary->4->3->2->1->5->6->7->8->9,此时已经交换结束,就是如何判断是否交换结束呢?因为tail是存储待交换k个节点的最后一个节点的,所以只需要判断auxiliary->next是否等于tail就可以了,如果是代表交换结束。
结束之后如果更改节点信息,让auxiliary节点赋值为1这个节点就可以了,这样它就相当于也是在待交换的k个节点的前一个节点,然后tail存储8,代表最后一个,cur存储5,代表待交换的第一个。
这次交换完之后结果是auxiliary->4->3->2->1->8->7->6->5->9,然后剩下一个9,判断出不满k个,直接结束交换。

### code

class Solution {public:ListNode* reverseKGroup(ListNode* head, int k) {ListNode* res=new ListNode(0);res->next=head;ListNode* tail=res;ListNode* auxiliary=res;//辅助节点ListNode* cur=head;while(1){int cout=0;while(tail!=NULL&&cout<k){tail=tail->next;//将tail节点指向待反转的末尾节点cout++;}if(tail==NULL)//代表不足k个return res->next;while(auxiliary->next!=tail)//进行交换{cur=auxiliary->next;auxiliary->next=cur->next;//将cur从链表中取出cur->next=tail->next;tail->next=cur;//将cur添加到tail之后}auxiliary=head;//更新auxiliarytail=head;cur=auxiliary->next;head=head->next; }return res->next;}
};

每隔k次反转一次 链表_leetcode 25 K个一组翻转链表(c++)相关推荐

  1. Leetcode-递归/反转链表模板-25. K 个一组翻转链表

    题目25. K 个一组翻转链表: 题解: 模拟 以K个为一组,进行常规反转,重点是要保留反转前的头节点,以及第K+1个节点,将其反转之后连接起来 代码: /*** Definition for sin ...

  2. 25. K 个一组翻转链表

    25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...

  3. LeetCode--第25题K个一组翻转链表

    LeetCode–第25题K个一组翻转链表 题目描述 解决方案–C语言 主体是用递归的办法.递归三要素: 1.向上返回什么:一个处理好的子链表 2.返回条件是什么:要么是处于好了子链表,要么是因长度小 ...

  4. K 个一组翻转链表(递归,Kotlin)

    25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...

  5. 【Java】【leetcode第25题】K 个一组翻转链表

    文章仅供自己学习记录所用,若有侵权.联系我删除! 接着来个链表题(听说字节考了) [K 个一组翻转链表] 其实这道题是206题和24题结合的一个进阶版本,我觉得关键就是控制范围(反正我自己折磨了很久, ...

  6. 链表经典题:K个一组翻转链表

    题目: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这 ...

  7. LeetCode-25:K 个一组翻转链表

    题目描述: 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序. 示例 ...

  8. 20200329:K 个一组翻转链表(leetcode25)

    K 个一组翻转链表 题目 思路与算法 代码实现 复杂度分析 题目 思路与算法 注意题目里的常数的额外空间的要求,意味着不可以使用栈之类的数据结构. 这道链表题实际就是上一道的进阶版,指定每k个进行翻转 ...

  9. 哔哩哔哩2020校园招聘 - K个一组翻转链表 一年中的第几天

    1.K个一组翻转链表 题目描述: 给你一个链表,每 k 个节点一组进行翻转,请返回翻转后的链表. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序. 示例 : 给定这个链表:1-&g ...

最新文章

  1. linux 虚拟化之rhev Hypervisor 安装
  2. python菜鸟excel教程-Python菜鸟之路: 封装通用excel操作
  3. javaweb 中的过滤器 包装器
  4. SpringBoot-MyBatis
  5. 使用IQueryable扩展方法实现复杂查询条件
  6. 【SDOI2017】硬币游戏【KMP】【概率期望】【高斯消元】
  7. 新东方mti百科知识pdf_20南航翻硕mti初试417上岸经验贴
  8. 公司 邮件 翻译 培训 长难句 结课
  9. 封装的一个http请求struct,包含:头、cookie、代理、超时、本地ip切换
  10. QT之Qt之Q_PROPERTY宏理解
  11. myeclipse 上安装 Maven3
  12. windbg查询内存泄笔记
  13. keras训练cifar10数据集源代码
  14. php用户注册重复_php实现单个用户禁止重复登录,防止同一用户同时登陆
  15. python开发录屏软件_Python移动端录屏库
  16. 微信三方平台调试过程中遇到的问题
  17. VMware新建虚拟机在按照过程图形化鼠标点击不了,
  18. java彩票机选生成
  19. mysql connect reset_困扰我多年的Connection reset问题
  20. 分享一批学习资料教程视频书籍

热门文章

  1. Vim - 容易忘记但又比较常用的操作 (之一)
  2. net start mysql启动mysql,提示发生系统错误 5 拒绝访问 解决方法
  3. 如何删除Cookie?
  4. 如何在返回String的Spring MVC @ResponseBody方法中响应HTTP 400错误?
  5. 一个或多个实体的验证失败。 有关更多详细信息,请参见“ EntityValidationErrors”属性
  6. 从JavaScript数组获取随机值
  7. 你什么时候使用git rebase而不是git merge?
  8. 记录下最近写前端的一些小技巧
  9. 360企业安全完成Pre-B轮12.5亿融资
  10. 【译】JavaScript 核心(第二版)