以K个为一组反转单链表,最后不足K个节点的部分也反转
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个节点的部分也反转的更多相关文章
- 将单链表的每K个节点之间逆序
		[说明]: 本文是左程云老师所著的<程序员面试代码指南>第二章中“将单链表的每K个节点之间逆序”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解析说明, ... 
- 【链表问题】打卡9:将单链表的每K个节点之间逆序
		前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获.每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢. 注:如果代码排版出现了问题麻烦通知我下 ... 
- 栈和队列----将单链表的每K个节点之间逆序
		将单链表的每K个节点之间逆序 给定一个单链表的头节点head,实现一个调整链表的函数,使得每K 个节点之间逆序,如果最后剩下不够K 个节点,则不调整最后几个. 例如: 链表:1—>2—>3 ... 
- 【数据结构】单链表介绍及leetcode206题反转单链表python实现
		题目传送门:https://leetcode-cn.com/problems/reverse-linked-list/ 文章目录 单链表介绍 链表 概念 种类 优缺点 单链表(slist) leetc ... 
- Reverse反转算法+斐波那契数列递归+Reverse反转单链表算法--C++实现
		Reverse反转算法 #include <iostream> using namespace std; //交换的函数 void replaced(int &a,int & ... 
- 在O(n) 时间复杂度,O(1)空间复杂度内反转单链表
		在LeetCode中看到判断回文的程序:https://leetcode.com/problems/palindrome-linked-list/ 里面用单链表来存储数据,先反转前半部分的单链表,然后 ... 
- 删除单链表倒数第n个节点
		基本问题 如何删除单链表中的倒数第n个节点? 常规解法 先遍历一遍单链表,计算出单链表的长度,然后,从单链表头部删除指定的节点. 代码实现 /** * * Description: 删除单链表倒数第n ... 
- Leetcode25--->Reverse Nodes in k-Group(以k个节点为段,反转单链表)
		题目: 给定一个单链表,一次反转k个节点,最终返回翻转后的链表的头节点:如果链表不足k个,则不变 举例: Given this linked list: 1->2->3->4-> ... 
- 左神算法书籍《程序员代码面试指南》——2_11将单链表的每K个节点之间逆序
		[题目]给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点.例如:链表:1->2->3->4->5 ... 
随机推荐
- 多线程-ConcurrentHashMap(JDK1.8)
			前言 HashMap非线程安全的,HashTable是线程安全的,所有涉及到多线程操作的都加上了synchronized关键字来锁住整个table,这就意味着所有的线程都在竞争一把锁,在多线程的环境下 ... 
- Android实现微信自己主动抢红包的程序
			简单实现了微信自己主动抢红包的服务,原理就是依据keyword找到对应的View, 然后自己主动点击.主要是用到AccessibilityService这个辅助服务,基本能够满足自己主动抢红包的功能, ... 
- makefile之short函数
			函数名称:排序函数-$(sort LIST) 函数功能:给字串"LIST"中的单词以首字母为准进行排序(升序),并去掉重复的单词. 返回值:空格分割的没有重复单词的字串. 函数说明 ... 
- js上传控件 plupload 使用记录
			最近一个项目需要使用一个上传控件进行多图片上传,给用户更好的体验,找到了plupload,用了一下感觉还是不错的, 1.从官网上 可以获得例子 ,我集成到了jsp,如下: <%@ page l ... 
- curl编译
			首先下载并解压: wget http://curl.haxx.se/download/curl-7.37.1.tar.gz tar -xzvf curl-7.37.1.tar.gz 编译安装: cd ... 
- js 正则表达式 验证小数点后几位
			function IsFloatByBit (value, state, bit) { if (state == false) { var re ... 
- Flow construction SGU - 176 有源汇有上下界最小流 二分法和回流法
			/** 题目:Flow construction SGU - 176 链接:https://vjudge.net/problem/SGU-176 题意: 有源汇有上下界的最小流. 给定n个点,m个管道 ... 
- chpasswd 更简单的更改密码的方式
			[root@m01 .ssh]# useradd test[root@m01 .ssh]# echo "test:123"|chpasswd Linux命令:chpasswd 批量 ... 
- pl/sql 实例精解 04
			本章主要讨论, IF 语句的应用. 1: if condition1 then 2: statement1 3: elsif condition2 then 4: statement2 5: else ... 
- 第一百五十二节,封装库--JavaScript,表单验证--年月日注入
			封装库--JavaScript,表单验证--年月日注入 效果图 html <div id="reg"> <h2 class="tuo"> ... 
