LeetCode 25. Reverse Nodes in k-Group

博客转载自:http://www.cnblogs.com/grandyang/p/4441324.html
Solution1:【重点理解记忆!!!】
代码要好好画几个图才能理解,建议花k = 5,链表长度为7的试一试才能深刻理解~
此解法和LeetCode24看似差不多,但细节处不一样~
这道题让我们以每k个为一组来翻转链表,实际上是把原链表分成若干小段,然后分别对其进行翻转,那么肯定总共需要两个函数,一个是用来分段的,一个是用来翻转的,我们就以题目中给的例子来看,对于给定链表1->2->3->4->5,一般在处理链表问题时,我们大多时候都会在开头再加一个dummy node,因为翻转链表时头结点可能会变化,为了记录当前最新的头结点的位置而引入的dummy node,那么我们加入dummy node后的链表变为-1->1->2->3->4->5,如果k为3的话,我们的目标是将1,2,3翻转一下,那么我们需要一些指针,pre和next分别指向要翻转的链表的前后的位置,然后翻转后pre的位置更新到如下新的位置:

-1->1->2->3->4->5|           |
pre         next-1->3->2->1->4->5|  |pre next

代码

/*** 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) {if (!head || k == 1) return head;ListNode *dummy = new ListNode(-1);ListNode *pre = dummy, *cur = head;dummy->next = head;int i = 0;while (cur) {++i;if (i % k == 0) {pre = reverseOneGroup(pre, cur->next);cur = pre->next;} else {cur = cur->next;}}return dummy->next;}ListNode *reverseOneGroup(ListNode *pre, ListNode *next) {ListNode *last = pre->next;ListNode *cur = last->next;while(cur != next) {last->next = cur->next;cur->next = pre->next;pre->next = cur;cur = last->next;}return last;}
};

Solution2:
我们使用递归来做,我们用head记录每段的开始位置,cur记录结束位置的下一个节点,然后我们调用reverse函数来将这段翻转,然后得到一个new_head,原来的head就变成了末尾,这时候后面接上递归调用下一段得到的新节点,返回new_head即可,参见代码如下:

class Solution {
public:ListNode* reverseKGroup(ListNode* head, int k) {ListNode *cur = head;for (int i = 0; i < k; ++i) {if (!cur) return head;cur = cur->next;}ListNode *new_head = reverse(head, cur);head->next = reverseKGroup(cur, k);return new_head;}ListNode* reverse(ListNode* head, ListNode* tail) {ListNode *pre = tail;while (head != tail) {ListNode *t = head->next;head->next = pre;pre = head;head = t;}return pre;}
};

【重点】LeetCode 25. Reverse Nodes in k-Group相关推荐

  1. LeetCode - 25. Reverse Nodes in k-Group

    25. Reverse Nodes in k-Group Problem's Link -------------------------------------------------------- ...

  2. LeetCode 25 Reverse Nodes in k-Group Add to List (划分list为k组)

    题目链接: https://leetcode.com/problems/reverse-nodes-in-k-group/?tab=Description Problem :将一个有序list划分为k ...

  3. leetcode 25. Reverse Nodes in k-Group | 25. K 个一组翻转链表(Java)

    题目 https://leetcode.com/problems/reverse-nodes-in-k-group/ 题解 乍一看以为很容易:每 k 个节点翻转,若剩余不足 k 个,则不变.没有什么技 ...

  4. 25. Reverse Nodes in k-Group

    https://leetcode.com/problems/reverse-nodes-in-k-group/description/ 题意:给一个链表和一个正数k,将链表划分成多个长度为k的链,将这 ...

  5. 【leetcode】25. Reverse Nodes in k-Group 链表按K分段逆序

    1. 题目 Given a linked list, reverse the nodes of a linked list k at a time and return its modified li ...

  6. 【LeetCode】863. All Nodes Distance K in Binary Tree 解题报告(Python)

    [LeetCode]863. All Nodes Distance K in Binary Tree 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http ...

  7. 【重点】LeetCode 24. Swap Nodes in Pairs

    LeetCode 24. Swap Nodes in Pairs 参考网址:http://www.cnblogs.com/grandyang/p/4441680.html 此题算是链表中比较考察细节的 ...

  8. LeetCode之Reverse String II

    1.题目 Given a string and an integer k, you need to reverse the first k characters for every 2k charac ...

  9. LeetCode 974. 和可被 K 整除的子数组(哈希map)

    1. 题目 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续.非空)子数组的数目. 示例: 输入:A = [4,5,0,-2,-3,1], K = 5 输出:7 解释: 有 7 个子数组满 ...

最新文章

  1. java全能速查宝典.chm_Java API 快速速查宝典
  2. BZOJ1566:[NOI2009]管道取珠——题解
  3. html怎么给框格加背景图,怎么给word 2013表格添加漂亮的背景图片
  4. Lost Cows POJ - 2182(线段树)
  5. PHP自学3——在html的table标签中显示用户提交表单
  6. CentOS7没有ifconfig命令的解决方法
  7. linux 帐号 配置sftp_Linux 下sftp配置之密钥方式登录详解
  8. 小李飞刀:SQL题目刷起来!
  9. 一次weblogic 在aix hacmp上调试过程
  10. Spring Boot + Thymeleaf + Activiti 快速开发平台项目,附源码!
  11. Markdown打造高逼格博客
  12. LINUX中获得cpu名称
  13. 顺序输出一个整数的各位数字
  14. php 正态分布数据描述,啥?你的数据不呈正态分布,文章发不了:stata一键搞定...
  15. 【AD】altium designer绘制原理图使用教程
  16. php 通过 谷歌邮箱发送邮件
  17. KMplayer附加音轨设置及影音同步问题
  18. QT笔记——Qt动态属性 之 unpolish() 和 polish()
  19. ssm搭建整合,这一篇你直接拷走就是一个搭好的框架,前后端可分离,可不分离
  20. BLOXORZ 游戏攻略

热门文章

  1. 视觉slam学习笔记以及课后习题《第五讲特征点法视觉里程计》
  2. VScode+远程服务器docker+C/C++ 代码挑战配置
  3. 反向传播(Back Propagation)与神经网络(Neural Network)
  4. java维护_java配置和维护
  5. vscode 背景图片的设置
  6. arm中断保护和恢复_ARM中断处理过程
  7. python开发工具和框架安装器_Python基础框架和工具
  8. android 图片存储读取数据库中,如何在android中存储(位图图像​​)并从sqlite数据库中检索图像?...
  9. 正则表达式python_Python正则表达式
  10. Android Material Components – MaterialAlertDialog