以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 ...
随机推荐
- 多线程-ThreadLocal,InheritableThreadLocal
ThreadLocal 变量值得共享可以使用public static变量的形式,所有的线程都使用同一个public static变量.如果想实现每一个线程都有自己的共享变量该如何解决呢?JDK中提供 ...
- [k8s]监控
监控架构 参考 https://github.com/DataDog/the-monitor/blob/master/kubernetes/how-to-collect-and-graph-kuber ...
- html页面中js判断浏览器是否是IE浏览器及IE浏览器版本
HTML里: HTML代码中,在编写网页代码时,各种浏览器的兼容性是个必须考虑的问题,有些时候无法找到适合所有浏览器的写法,就只能写根据浏览器种类区别的代码,这时就要用到判断代码了.在HTML代码中, ...
- Web前端的状态管理(State Management)
背景 我相信很多朋友跟我一样,初次听到什么Flux, Redux, Vuex,状态管理的时候是一脸懵逼的.因为在外面之前前端大部分开发的时候,根本没有那么多的概念.自从ReactJS火爆后,什么Flu ...
- IE的layout布局
我们那知道浏览器有bug,而且Windows上的lE的bug 似乎比太多数浏览器都多.IE/Win的表现与其他浏览器不同的原因之一是,显示引擎使用一个称为布局(layout)的内部概念.因为布均是一个 ...
- [JNA系列]Java调用Delphi编写的Dll之实例Delphi使用PWideChar
Delphi代码 unit UnitDll; interface uses StrUtils, SysUtils, Dialogs; function DoBusinessWide(pvData: P ...
- SQL练习题汇总(Sqlserver和Mysql版本)
所需表及数据执行脚本: CREATE TABLE STUDENT (SNO ) NOT NULL, SNAME ) NOT NULL, SSEX ) NOT NULL, SBIRTHDAY DATET ...
- linux之mail
使用该命令自动把系统发给root用户的邮件发送到自己的邮箱 #vi /etc/aliases # 编辑该文件并在最后一行添加即可,如图所示
- C++忽略字符大小写比较
在项目中用到对两个字符串进行忽略大小写的比较,有两个方法实现 1.使用C++提供的忽略大小写比较函数实现 代码实现: /* 功能 :忽略大小写进行字符串比较 */ #ifdef __LINUX__ # ...
- 完工尚需绩效指数 TCPI
转自:http://www.cnblogs.com/allenblogs/archive/2010/12/09/1901404.html TCPI To Complete Performance In ...