算法总结之 将单链表的每K个节点之间逆序
给定一个单链表的表头节点head,实现一个调整单链表的函数,是的每k个节点之间逆序,如果最后不够k个节点一组,则不调整最后几个节点
思路:
如果k的值小于2,不调整。k<1 没有意义,k==1代表1个节点为1组进行逆序,原链表不变。
介绍两种方法:
方法一 利用栈结构
1、从左到右便利链表,如果栈的大小不等于k,就将节点不断压入栈中
2、当栈大小第一次到达k,凑齐了k个节点进行逆序。然后弹出,并且连接。第一组逆序完成后,记录新的头,同时第一组最后一个(原头)连接下一个节点
package TT; import java.util.Stack; public class Test103 { public class Node{ public int value;
public Node next; public Node(int data){
this.value = data;
}
} public Node reverseKNodes1(Node head, int k){ if(k<2){
return head;
}
Stack<Node> stack = new Stack<Node>();
Node newHead = head;
Node cur = head;
Node pre = null;
Node next = null;
while(cur!=null){
next = cur.next;
stack.push(cur);
if(stack.size()==k){
pre=resign1(stack, pre, next);
newHead = newHead==head ? cur : newHead;
}
cur = next;
}
return newHead;
} public Node resign1(Stack<Node> stack, Node left, Node right){
Node cur = stack.pop();
if(left !=null){
left.next=cur;
}
Node next=null;
while(!stack.isEmpty()){
next = stack.pop();
cur.next=next;
cur=next;
}
cur.next=right;
return cur;
} }
方法二、不需要栈结构,在原链表中直接调整
用变量记录每一组开始的第一个节点和最后一个节点。然后直接逆序调整,把这一组的节点都逆序。和方法一一样,同样需要注意第一组节点的特殊处理,以及之后的每个组在逆序重连之后,需要让该组的第一个节点(原来是最后一个节点)被之前的最后一个连上,将该组的最后一个节点连接下一个节点
package TT; public class Test104 { public class Node{
int value;
public Node next;
public Node(int data){
this.value = data;
}
} public Node reverseKNodea2(Node head, int k){ if(k<2){
return head;
}
Node cur = head;
Node start=null;
Node pre=null;
Node next=null;
int count=1;
while(cur!=null){
next = cur.next;
if(count==k){
start=pre==null?head:pre.next;
head=pre==null?cur:head;
resign2(pre,start,cur,next);
pre=start;
count=0;
}
count ++;
cur=next;
}
return head; } public void resign2(Node left, Node start, Node end, Node right){ Node pre=start;
Node cur=start.next;
Node next=null;
while(cur!=null){
next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
}
if(left!=null){
left.next=end;
}
start.next=right;
} }
算法总结之 将单链表的每K个节点之间逆序的更多相关文章
- 将单链表的每K个节点之间逆序
[说明]: 本文是左程云老师所著的<程序员面试代码指南>第二章中“将单链表的每K个节点之间逆序”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解析说明, ...
- 【链表问题】打卡9:将单链表的每K个节点之间逆序
前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获.每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢. 注:如果代码排版出现了问题麻烦通知我下 ...
- 栈和队列----将单链表的每K个节点之间逆序
将单链表的每K个节点之间逆序 给定一个单链表的头节点head,实现一个调整链表的函数,使得每K 个节点之间逆序,如果最后剩下不够K 个节点,则不调整最后几个. 例如: 链表:1—>2—>3 ...
- [算法] 将单链表的每K个节点之间逆序
题目 给定一个单链表的头结点,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点. 解答 使用栈结构 import java.util.Stack; pu ...
- 左神算法书籍《程序员代码面试指南》——2_11将单链表的每K个节点之间逆序
[题目]给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点.例如:链表:1->2->3->4->5 ...
- [程序员代码面试指南]链表问题-将单链表的每k个节点之间逆序
题目描述 给定一个单链表的表头节点head,实现一个调整单链表的函数,是的每k个节点之间逆序,如果最后不够k个节点一组,则不调整最后几个节点. 题解 内部函数reverse实现链表beg到end的翻转 ...
- 《程序员代码面试指南》第二章 链表问题 将单链表每K个节点之间逆序
样例 链表1-2-3-4-5-6-7-8-9-10 K=3 ,结果 3-2-1-6-5-4-9-8-7-10 java代码 /** * @Description:将单链表每K个节点之间逆序 * @Au ...
- [剑指offer] 14. 链表中倒数第K个节点+翻转+逆序打印+合并两个排序链表 + 链表相交(第一个公共节点) (链表)
题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路: 两个指针,起始位置都是从链表头开始,第一个比第二个先走K个节点,当第一个走到链表尾时,第二个指针的位置就是倒数第k个节点.(两指针始终相 ...
- 【链表问题】打卡2:删除单链表的第 K个节点
前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题.每道题会提供简单的解答. 题目描述 在单链表中删除倒数第 K 个节点 要求 如果链表的长度为 N, 时间复杂度达到 O(N), 额外空间复杂度达到 ...
随机推荐
- Jqurey实现相似EasyUI的页面布局
截图例如以下:(可通过移动中间蓝色的条.来改变左右两边div的宽度) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuZ21pbmd4aW5nOTgw ...
- [Docker]学习笔记--简单介绍
学习docker已经有一段时间了,一直没有静下心来好好总结一下. 最近用docker搭了一整套Gitlab的持续集成环境.(会在下一篇中详细的讲解具体步骤,敬请期待) 感觉是时候写点东西和大家一起分享 ...
- 记录--java 分页 思路 (hibernate关键代码)
有时会脑袋蒙圈,记录下分页的思路 下面代码是hibernate的分页,其分页就是从第几条数据为起点,取几条数据.比如在mysql中的limit(5,10)取的就是第6条到第10条 在下面代码中的pag ...
- C语言练习题
C语言练习题 1. 以下选项中,合法的一组C语言数值常量是( ) A)028 .5e-3 .0xf B)12. OXa23 4.5e0 C).177 4e1.5 Oabc D) ...
- Vue中watch的简单应用
Vue.js 有一个方法 watch,它可以用来监测Vue实例上的数据变动. 如果对应一个对象,键是观察表达式,值是对应回调,值也可以是方法名,或者是对象,包含选项. 下面写两个demo,参考demo ...
- PyNest——part 2: populations of neurons
part 2: populations of neurons introduction 在这篇讲义中,我们着眼于创建和参数化神经元批次,并将它们连接起来. 当你完成这些材料时,你会知道如何: 创建具有 ...
- 20170520 BADI增强学习
一.要求:Tcode:FF_5 导入数据运行时,产生财务凭证之前修改某些字段值.Exmp:FEBRE-VWEZWBKPF-XBLNRFEBEP-CHECTBSEG-ZUONR there is a b ...
- Some day some time we will do
Age has been reached the end of the beginning of the world,May be guilty in his seems to passing a l ...
- 玩转NumPy数组
一.Numpy 数值类型 1.前言:Python 本身支持的数值类型有 int(整型, long 长整型).float(浮点型).bool(布尔型) 和 complex(复数型).而 Numpy 支持 ...
- XP、win7下Excel 2007多窗口打开Excel的解决方法
http://blog.x6x8.com/?p=330 Win7下的方法(借鉴了XP的方法): 1.先在桌面先建一个txt文件,将下面的代码复制进去 32位WIN7复制下面一行start “Excel ...