package StackMin.ReverseList_offer16;

public class ReverseKgroup_extend_offer16 {
/**
* 分组反转单链表,最后不足K个节点的部分也反转
*
* @param head
* @param k
* @return
*/
public static ListNode reverseKgroup(ListNode head, int k) {
if (head == null)
return head;
ListNode cur = head;
ListNode reHead = null; int count = 0;
/* Reverse first k nodes of linked list */
while (count < k && cur != null) {
ListNode reCur = cur;
cur = cur.next;
reCur.next = reHead;
reHead = reCur;
count++;
}
/*
* cur is now a pointer to (k+1)th node Recursively call for the
* list starting from current. And make rest of the list as next of
* first node
*/
if (cur != null)
head.next = reverseKgroup(cur, k); return reHead;
} }
package StackMin.ReverseList_offer16;

public class ReverseKgroup_extend_offer16 {
/**
* 分组反转单链表,最后不足K个节点的部分也反转
*
* @param head
* @param k
* @return
*/
/*
输入的原始单链表为3-5-6-9-7-2-1-12,其中K为3;
经过第一次while循环,单链表变为6-5-3-9-7-2-1-12。此时跳出while循环是因为count<k不成立了,cur节点指向了9,head节点指向了3。
所以接着判断cur是否为null,若不是,则刚好递归求出head.next。
经过第二次while循环,单链表为6-5-3-2-7-9-1-12。此时跳出while循环是因为count<k不成立了,cur节点指向了1,head节点指向了9。
接着判断cur,并且递归求head.next节点。
第三次循环,跳出while是因为cur==null了,直接返回reHead,此时reHead指向了12。
*/
public ListNode reverseKgroup(ListNode head, int k) {
if (head == null)
return head;
ListNode cur = head;
ListNode reHead = null; int count = 0;
/* Reverse first k nodes of linked list */
while (count < k && cur != null) {
ListNode reCur = cur;
cur = cur.next;
reCur.next = reHead;
reHead = reCur;
count++;
}
/*
* cur is now a pointer to (k+1)th node Recursively call for the
* list starting from current. And make rest of the list as next of
* first node
*/
if (cur != null)
head.next = reverseKgroup(cur, k); return reHead;
} public static void main(String[] args) {
ListNode head = new ListNode(3);
ListNode L2 = new ListNode(5);
ListNode L3 = new ListNode(6);
ListNode L4 = new ListNode(9);
ListNode L5 = new ListNode(7);
ListNode L6 = new ListNode(2);
ListNode L7 = new ListNode(1);
ListNode L8 = new ListNode(12);
head.next = L2;
L2.next = L3;
L3.next = L4;
L4.next = L5;
L5.next = L6;
L6.next = L7;
L7.next = L8;
ReverseKgroup_extend_offer16 reverseKgroup_extend_offer16 = new ReverseKgroup_extend_offer16();
reverseKgroup_extend_offer16.printListNode(head);
System.out.println();
ListNode node = reverseKgroup_extend_offer16.reverseKgroup(head, 3);
reverseKgroup_extend_offer16.printListNode(node); } public void printListNode(ListNode node) {
while (node != null) {
if (node.next == null) {
System.out.print(node.val); } else {
System.out.print(node.val + ">");
}
node = node.next;
}
} }
package StackMin.ReverseList_offer16;

public class ListNode {
int val;
public ListNode next = null; ListNode(int val) {
this.val = val;
} }

以K个为一组反转单链表,最后不足K个节点的部分也反转的更多相关文章

  1. 将单链表的每K个节点之间逆序

    [说明]: 本文是左程云老师所著的<程序员面试代码指南>第二章中“将单链表的每K个节点之间逆序”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解析说明, ...

  2. 【链表问题】打卡9:将单链表的每K个节点之间逆序

    前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获.每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢. 注:如果代码排版出现了问题麻烦通知我下 ...

  3. 栈和队列----将单链表的每K个节点之间逆序

    将单链表的每K个节点之间逆序 给定一个单链表的头节点head,实现一个调整链表的函数,使得每K 个节点之间逆序,如果最后剩下不够K 个节点,则不调整最后几个. 例如: 链表:1—>2—>3 ...

  4. 【数据结构】单链表介绍及leetcode206题反转单链表python实现

    题目传送门:https://leetcode-cn.com/problems/reverse-linked-list/ 文章目录 单链表介绍 链表 概念 种类 优缺点 单链表(slist) leetc ...

  5. Reverse反转算法+斐波那契数列递归+Reverse反转单链表算法--C++实现

    Reverse反转算法 #include <iostream> using namespace std; //交换的函数 void replaced(int &a,int & ...

  6. 在O(n) 时间复杂度,O(1)空间复杂度内反转单链表

    在LeetCode中看到判断回文的程序:https://leetcode.com/problems/palindrome-linked-list/ 里面用单链表来存储数据,先反转前半部分的单链表,然后 ...

  7. 删除单链表倒数第n个节点

    基本问题 如何删除单链表中的倒数第n个节点? 常规解法 先遍历一遍单链表,计算出单链表的长度,然后,从单链表头部删除指定的节点. 代码实现 /** * * Description: 删除单链表倒数第n ...

  8. Leetcode25--->Reverse Nodes in k-Group(以k个节点为段,反转单链表)

    题目: 给定一个单链表,一次反转k个节点,最终返回翻转后的链表的头节点:如果链表不足k个,则不变 举例: Given this linked list: 1->2->3->4-> ...

  9. 左神算法书籍《程序员代码面试指南》——2_11将单链表的每K个节点之间逆序

    [题目]给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点.例如:链表:1->2->3->4->5 ...

随机推荐

  1. DB2字符处理函数

    转自:http://www.blogjava.net/bingle/archive/2007/07/11/129681.html ----------------------------------- ...

  2. hdu Distant Galaxy(遥远的银河)

    Distant Galaxy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  3. jdk8 StreamApi

    List<User> userList=new ArrayList<>(); userList.add(User.builder().age().name()).build() ...

  4. 关于OutputStream的write方法FAQ(from bbs.csdn.net)

    问: Java code ? 1 2 3 4 5 6 7 8 9 10 11 FileInputStream fis = new FileInputStream(new File("C:\\ ...

  5. 利用FFmpeg切割视频

    关键词:FFmpeg,seek,ss,t,to,搜索,定位 介绍 如果你想要从输入文件中切割一部分,需要用到ss选项. 快速定位 需要将ss放在输入文件的前面(即-i的前面) elesos1.jpg ...

  6. SecureCRT超级终端使用说明

    SecureCRT超级终端使用说明 一.连接POS机 1.运行SecureCRT,选择‘文件’菜单,在下拉菜单中选择‘快速连接’菜单: 2.在弹出的对话框中按如下图选择参数: 3.POS端开机,且数据 ...

  7. java 教程

    1.视频教程 http://blog.csdn.net/zhangdaiscott/article/details/18220411 2.书籍教程: 3.学习课程

  8. EasyUI combobox 加载JSON数据《一》

    Action返回 JSON 格式如下: jsonResult = { total=7,rows=[ {TEXT=技术支持, ID=402894ca4419acf1014419b148a10000}, ...

  9. SVD分解与数据压缩

    SVD的几何解释:http://blog.csdn.net/dinosoft/article/details/37884597 上文未证明为什么AAT的特征向量就是要找的v 这里有个简单的说明: SV ...

  10. python 2个版本如何共存

    我们在安装Python3(>=3.3)时,Python的安装包实际上在系统中安装了一个启动器py.exe,默认放置在文件夹C:\Windows\下面.这个启动器允许我们指定使用Python2还是 ...