题目:

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

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

示例 :

给定这个链表:1->2->3->4->5当 k = 2 时,应当返回: 2->1->4->3->5当 k = 3 时,应当返回: 3->2->1->4->5

说明 :

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

package com.letcode.list;class ListNode{int val;ListNode next;ListNode(int x){val = x;}
}/*
* 给定这个链表:1->2->3->4->5
*   当 k = 2 时,应当返回: 2->1->4->3->5
*   当 k = 3 时,应当返回: 3->2->1->4->5
*/
public class ReverseKNodes {ListNode newTail=null;public static void main(String[] args) {System.out.println("main...");ListNode a = new ListNode(1);ListNode b = new ListNode(2);ListNode c = new ListNode(3);ListNode d = new ListNode(4);ListNode e = new ListNode(5);a.next = b;b.next = c;c.next = d;d.next = e;ReverseKNodes reverseKNodes = new ReverseKNodes();ListNode newHead = reverseKNodes.reverseKGroup(a, 4);while(null != newHead){System.out.println(newHead.val);newHead = newHead.next;}}public ListNode reverseKGroup(ListNode head, int k) {// k肯定是大于等于2的,这样反转链表才有意义,所以当k<=1时,直接返还if(head==null||k<=1){return head;}ListNode newHead=new ListNode(-1);//每k个反转链表的前置头结点newHead.next=head;ListNode tail=head;//每一组链表的尾结点head=newHead;int n=1;System.out.println(tail.val);while(tail!=null){if(n%k==0){// n%k==0 表示每k个节点进行一次反转newTail=newHead.next;//新的尾结点System.out.println("newTail:"+newTail.val);reverse(newHead,tail);newHead=newTail;//上一组的尾结点做下一组的头结点tail=newTail;}tail=tail.next;n++;}return head.next;}// -1(n) 1 2 3 4(t) 5public void reverse(ListNode head,ListNode tail){//head为头结点,不带有任何参数,并且能调用这个函数,说明至少有两个及以上的节点需要逆置,//所以第一次的cur代表第二个元素,不会空指针ListNode cur=head.next.next;//准备前插的元素   2ListNode curNext=cur.next;//前插的下一个元素,可能为空 3//while(cur!=null){while(true){//不需要判断cur和curNext为空的情况,while里面可以直接写true//因为tail是本次逆置部分的最后一个元素,cur前插肯定会遇见它cur.next=head.next;//连接后面 2 1head.next=cur;//连接头结点 -1 2 1if(cur==tail){newTail.next=curNext;//将新链表的尾部与下一次k链的第一个元素进行连接break;}cur=curNext;//下一个需要头插的元素  4curNext=cur.next;  // 5}}
}

常考数据结构与算法:每k个节点反转链表相关推荐

  1. 常考数据结构与算法:合并k个已排序的链表

    题目描述 合并\ k k 个已排序的链表并将其作为一个已排序的链表返回.分析并描述其复杂度. 示例1 输入 [{1,2,3},{4,5,6,7}] 返回值 {1,2,3,4,5,6,7} import ...

  2. 常考数据结构与算法:输出二叉树的右视图

    题目描述 请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图 上图树的右视图为:{1,4,3,7} 做此题之前可以先做下面3道题: 1. 常考数据结构与算法:求二叉树的层序遍历 2.常 ...

  3. 常考数据结构与算法:求二叉树的层序遍历

    题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], ...

  4. 常考数据结构与算法:删除链表的倒数第n个节点

    题目描述 给定一个链表,删除链表的倒数第n个节点并返回链表的头指针 例如, 给出的链表为:1->2->3->4->5, n= 2.删除了链表的倒数第n个节点之后,链表变为1-& ...

  5. 头歌实践教学平台数据结构与算法:02线性表——反转链表(拓展)

    针对数据结构02线性表--反转链表(拓展)在头歌平台练习过程中的完成代码,每题思路单独在每一关中解释.如有其他需求请留言. 第一关 已知一个带头结点的单链表L,将L反转并返回反转后的单链表.要求将L的 ...

  6. 常考数据结构与算法:最小的k个数

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 题目解答 使用小根堆 将n个元素全放进小根堆,再一个一个的弹出来, ...

  7. 常考数据结构与算法:查找第K大元素算法

    题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 扩展思考:如何处理数组中 ...

  8. 常考数据结构与算法:最长公共子串

    题目描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一. 示例1 输入 "1AB2345CD","1 ...

  9. 常考数据结构和算法:设计LRU缓存结构

    题目描述 设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能 set(key, value):将记录(key, value)插入该结构 get(key):返回key对应的val ...

最新文章

  1. 如何使用ADLab搭建活动目录实验环境来练习渗透测试技术
  2. 洛谷 1351 联合权值——树形dp
  3. python实现日历功能_Python实现的简单万年历例子分享
  4. hibernate.cfg.xml 配置(摘录)
  5. 云+X案例展 | 民生类:云途腾助力城建开启智慧城轨新征程
  6. typora代码块语言linux命令,typora工具的使用以及MarkDown语法
  7. linux怎么将终端一分为二,Linux下的终端和作业控制
  8. WCF NetTcpBinding Transport安全模式(7) ClientCredentialType证书验证模式---- ChainTrust验证模式...
  9. JAVA如何实现视频在线播放(MP4文件在线播放)
  10. IDEA 返回上一步,回到下一步 冲突 快捷键设置
  11. 使用PHP 的 curl 爬取 青果教务系统 课表
  12. 真西游记java,原来《西游记》原著真的很吓人,我们都被86版西游记骗了?
  13. 如何提取mp4中的音频?
  14. 用VC++6.0制作简易浏览器
  15. 舆情发展规律如何把控?
  16. Sketch插件开发入门
  17. 如何写产品介绍PPT
  18. 转:量化交易零基础入门教程之——python基本语法与变量
  19. ​Mysql安装不用愁,看完就能装
  20. linux u盘文件乱码,linux挂载u盘,汉字乱码,怎么处理

热门文章

  1. ExtJS4.1.1 设置表格背景颜色 修改文本颜色 在表格中插入图片
  2. 算法第5章上机实践报告
  3. 数据绑定(十)Binding的数据转换
  4. ios swift ios8 模糊
  5. cisco dhcp vlan vrrp ospf 实验
  6. [SinGuLaRiTy] 复习模板-搜索
  7. linux启动和关闭
  8. 如果禁用了cookie 怎么传session
  9. 基于Hadoop的云盘系统客户端技术选型说明
  10. Java文件非法字符