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

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

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

示例:

给你这个链表:1->2->3->4->5

当 = 2 时,应当返回: 2->1->4->3->5

当 = 3 时,应当返回: 3->2->1->4->5

说明:

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

/*** 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(k==1)return head;ListNode* tempHead = head;int length = 0;while(tempHead!=NULL){length++;tempHead = tempHead->next;}tempHead = head;vector<ListNode*> vec;int index = 0;ListNode* temp = NULL;while(index+k<=length){for(int i=0;i<k-1;++i){if(i==0)vec.push_back(tempHead);tempHead = tempHead->next;}temp = tempHead->next;tempHead->next = NULL;tempHead = temp;index+=k;}if(!vec.empty()){int len = vec.size();ListNode* node = NULL;ListNode* result = NULL;if(len>1){for(int i=0;i<len-1;++i){node = reverse(vec[i]);if(i==0)result = node;while(node->next!=NULL)node = node->next;node->next = reverse(vec[i+1]);}}else{node = reverse(vec[0]);result = node;}while(node->next!=NULL)node = node->next;node->next = tempHead;return result;}return head;}ListNode* reverse(ListNode* head){ListNode* t = head;ListNode* newHead = NULL;while(t!=NULL){ListNode* temp = t->next;t->next = newHead;newHead = t;t = temp;}return newHead;}
};

方法二:

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
class Solution {public ListNode reverseKGroup(ListNode head, int k) {if (head == null || head.next == null){return head;}//定义一个假的节点。ListNode dummy=new ListNode(0);//假节点的next指向head。// dummy->1->2->3->4->5dummy.next=head;//初始化pre和end都指向dummy。pre指每次要翻转的链表的头结点的上一个节点。end指每次要翻转的链表的尾节点ListNode pre=dummy;ListNode end=dummy;while(end.next!=null){//循环k次,找到需要翻转的链表的结尾,这里每次循环要判断end是否等于空,因为如果为空,end.next会报空指针异常。//dummy->1->2->3->4->5 若k为2,循环2次,end指向2for(int i=0;i<k&&end != null;i++){end=end.next;}//如果end==null,即需要翻转的链表的节点数小于k,不执行翻转。if(end==null){break;}//先记录下end.next,方便后面链接链表ListNode next=end.next;//然后断开链表end.next=null;//记录下要翻转链表的头节点ListNode start=pre.next;//翻转链表,pre.next指向翻转后的链表。1->2 变成2->1。 dummy->2->1pre.next=reverse(start);//翻转后头节点变到最后。通过.next把断开的链表重新链接。start.next=next;//将pre换成下次要翻转的链表的头结点的上一个节点。即startpre=start;//翻转结束,将end置为下次要翻转的链表的头结点的上一个节点。即startend=start;}return dummy.next;}//链表翻转// 例子:   head: 1->2->3->4public ListNode reverse(ListNode head) {//单链表为空或只有一个节点,直接返回原单链表if (head == null || head.next == null){return head;}//前一个节点指针ListNode preNode = null;//当前节点指针ListNode curNode = head;//下一个节点指针ListNode nextNode = null;while (curNode != null){nextNode = curNode.next;//nextNode 指向下一个节点,保存当前节点后面的链表。curNode.next=preNode;//将当前节点next域指向前一个节点   null<-1<-2<-3<-4preNode = curNode;//preNode 指针向后移动。preNode指向当前节点。curNode = nextNode;//curNode指针向后移动。下一个节点变成当前节点}return preNode;}}

K个一组翻转链表—leetcode25相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 清晰易懂的“K个一组翻转链表”解法

    题目来源:Leetcode K个一组翻转链表 一.题目 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍 ...

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

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

  8. 由力扣K 个一组翻转链表到360原创题

    前段时间帮对象做360笔试题时,遇到一个没怎么想明白的编程题,直到今天刷力扣遇到了相似的k个一组翻转链表后,想着在做一下那天的编程题,就想着记录一下遇到的难点. 力扣题如下图所示: 360原创题如下: ...

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

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

最新文章

  1. css元素可拖动,使用css-transform实现更好的拖拽功能
  2. 软件技术专业-就业提示(IT类详细岗位分化)
  3. 使用 Apache MINA 开发高性能网络应用程序
  4. java网站短信接口_网云JAVA短信接口API
  5. 为什么黑客都用python-为什么黑客都用python Python在各领域都有着广
  6. koa学习笔记(一)环境安装及文件目录
  7. 安装PostgreSQL客户端
  8. SaaSBase:什么是零一裂变SCRM?
  9. C++解决八数码问题
  10. Linux下图片 jpg、png、gif 与 eps 格式的相互转换
  11. oppoJava面试!一招彻底帮你搞定HashMap源码,极其重要
  12. 中国被黑站点统计系统 2006年9月分析报告
  13. 第三章课后习题重点内容
  14. 收费企业邮箱有哪些?哪个收费邮箱最好
  15. 判断Linux环境是否装了NCCL,安装cuDNN和NCCL指南
  16. PVE下的黑群晖的其他后续设置
  17. shp文件导入postgresql数据库
  18. [二] X 名称空间
  19. 原根算法C语言,算法导论-----数论-----元素的幂
  20. 股票实盘交易接口用什么编程的?

热门文章

  1. c 将数字数组转成字符串_C+|用指针指向字符串字面量、字符数组及字符指针数组...
  2. 数据结构与算法一 - 二叉树基础
  3. 创建AOP静态代理(上篇)
  4. vue中手机号,邮箱正则验证以及60s发送验证码
  5. 优雅的让Fragment监听返回键
  6. 快速构建Windows 8风格应用22-MessageDialog
  7. 牛客网(剑指offer) 第十九题 顺时针打印矩阵
  8. Python之精心整理的二十五个文本提取及NLP相关的处理案例
  9. 2015/Province_C_C++_C/6/奇妙的数字
  10. 1037:计算2的幂