本题源自LeetCode

--------------------------------------------------------------------

思路:

利用栈结构的解法,时间复杂度O(n),空间复杂度O(k)
1:从左到右遍历链表,如果栈的大小不等于k,就将节点不断压入栈中
2:当栈的大小第一次达到k时,说明第一次凑齐了k个节点进行逆序,从栈中依次弹出
这些节点,并根据弹出顺序依次链接,这一组逆序完成后,需要记录一下新的头部,
同时第一组的最后一个节点(原来是头结点)应该链接下一个节点。
3:步骤2之后,当栈的大小每次达到k时,说明又凑齐了一组应该进行逆序的节点,从
栈中依次弹出这些节点,并根据弹出的顺序重新链接。这一组逆序完成后,该组的第一
个节点(原来是该组最后一个节点)应该被上一组的最后一个节点链接上,这一组的最
后一个节点(原来是该组第一个节点)应该链接下一个节点。然后继续去凑下一组,直
到链表被遍历完成。

我们可以不用栈,直接在链表中进行操作

代码:

void reverseCore(ListNode* start,ListNode* end,ListNode* &newStart,ListNode* &newEnd){  //用的指针的引用,也可以用 **指针的指针ListNode* pNext=NULL;ListNode* p=start;ListNode* pre=NULL;newStart=end;newEnd=start;ListNode* nextNode=end->next;while(p!=nextNode){pNext=p->next;p->next=pre;pre=p;p=pNext;}}ListNode *reverseKGroup(ListNode *head, int k) {ListNode* p=head;ListNode* newHead=NULL;ListNode* start=head;ListNode* pre=NULL;ListNode* pNext=NULL;int count=1;while(p){pNext=p->next;if(count==k){   //节点数量到K 个 反转部分链表ListNode* newStart=NULL;ListNode* newEnd=NULL;reverseCore(start,p,newStart,newEnd);if(newHead==NULL)   //新链表的头指针newHead=newStart;if(pre)pre->next=newStart;   //保持链表链接newEnd->next=pNext;        pre=newEnd;               //保存上一个链表的尾节点start=pNext;              //保存每个局部链表的头count=0;                  //count清零}p=pNext;count++;}return newHead?newHead:head;}

思路2 :

考虑 用递归即 翻转pairs,翻转x~x+(k-1)之间的节点, x->next = reverseKGroup(x+k,k)

代码:

   ListNode* reverseCore(ListNode* start,ListNode* end){  //用的指针的引用,也可以用 **指针的指针ListNode* pNext=NULL;ListNode* p=start;ListNode* pre=NULL;while(p!=end){pNext=p->next;p->next=pre;pre=p;p=pNext;}return pre;}ListNode *reverseKGroup(ListNode *head, int k) {if(head==NULL||k<2)return head;ListNode *p=head;for(int i=0;i<k;i++){if(!p)return head;p=p->next;}ListNode* newHead=reverseCore(head,p);  //反转K链表head->next=reverseKGroup(p,k);  //保持链表不断。return newHead;}

思路3  非递归

遍历链表,每遍历k个节点,就反转。并且保持链表不断开

ListNode *reverseKGroup(ListNode *head, int k) {if(head==NULL||k<2)return head;ListNode *p=head;int len=0;while(p){p=p->next;len++;}ListNode* root=new ListNode(0);root->next=head;ListNode* pre=root;p=head;ListNode* pNext=NULL;for(int i=0;i<len/k;i++){   //循环len/k次for(int j=1;j<k;j++){    //每次反转k 个节点pNext=p->next;p->next=pNext->next;pNext->next=pre->next;pre->next=pNext;}pre=p;       //保持链表不断开p=p->next;}return root->next;}

给定一个链表,一次颠倒链表k的节点并返回其修改列表。如果节点的数量不是k的倍数,那末最后的剩余节点应该保持原样。相关推荐

  1. 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

    给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: ["255.255.11.135", ...

  2. 【算法-Java】给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

    一.示例 示例 1: 输入:s = "25525511135" 输出:["255.255.11.135","255.255.111.35"] ...

  3. -9 逆序输出一个整数的各位数字_【每日算法】基础算法——归并排序[求逆序对的数量](四)(思想很经典)...

    题目内容 给定一个长度为n的整数数列,请你计算数列中的逆序对的数量. 逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆 ...

  4. c语言给定一个单链表输入k,C语言实现单链表(不带头结点)的基本操作

    链表在数据结构和算法中的重要性不言而喻.这里我们要用C来实现链表(单链表)中的基本操作.对于链表的基本概念请参考<数据结构与算法之链表>这篇博客.示例代码上传至 https://githu ...

  5. 【Java】环形链表 ( 给定一个链表,判断链表中是否有环)

    题目描述 :给你一个链表的头节点 head ,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,评测系统内部使用整数 po ...

  6. 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3-&g ...

  7. 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点

    第 13 题(链表): 题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表 的尾指针. 链表结点定义如下: struct ListNode { int m_nKey ...

  8. 算法:输入一个链表,输出该链表中倒数第k个结点。

    算法:输入一个链表,输出该链表中倒数第k个结点.<剑指offer> 思路加到注释里面了: 1:两个if判断是否返回值为空,首个为空,没有第k个值: 2:for循环找到倒数第k个值,返回为a ...

  9. 一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针

    输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针 typedef struct _node_t {struct _node_t *next;int data; }Nod ...

最新文章

  1. MariaDB 数据库迁移
  2. html桌面卡牌效果,html+css实现响应式卡片悬停效果
  3. Redpine的Lite-Fi解决方案获Wi-Fi CERTIFIED认证
  4. how to identify keywords for search on Google Scholar?
  5. 工具的特性_16 个好用的 Code Review 工具
  6. PaddlePaddle训练营——公开课——AI核心技术掌握——第1章迈入现代人工智能的大门——深度学习的基础算法——反向传播算法简介
  7. 人工智能的炒作_为什么人工智能被过度炒作?
  8. hibernate dialect 方言 sqlserver2000 的方言
  9. [Ubuntu] apt 添加第三方库
  10. Leetcode c语言-Implement strStr()
  11. ARKit Plane Detection (平面检测)
  12. 20160220 - JavaScript for OS X Automation 调试技巧
  13. Axure原型图 时间跳动 计时动画效果
  14. erp进销存管理系统
  15. Oliver的救援(bfs)
  16. 【2021-07-23】JS逆向之雷速体育canvas渲染数据解密
  17. 欢迎各位大佬,哥哥姐姐 打赏,
  18. 如何配置无线WiFi短信认证登录?
  19. 数据中台建设方法论-4 实践
  20. 手用计算机怎么弄声音,手把手教你电脑声音太小怎么处理

热门文章

  1. 《通信原理》课后题 樊昌信
  2. 用powershell实现自动化操作
  3. 移动的智能私域终端 电动自行车智能化“智”在哪里
  4. Java实现输出 1000 - 2000 之间所有的闰年
  5. win10鼠标灵敏度怎么调_和平精英灵敏度左右晃怎么调最稳?2019灵敏度最新最稳调法推荐[多图]...
  6. 手写Spring-第十五章-我也要注入?为代理对象注入属性,完善AOP
  7. 单反化的数码相机 富士S205EXR评测2
  8. mootools_Periodical
  9. PTA:7-31 期刊收费
  10. Java 类的热替换 —— 概念、设计与实现