栈和队列----将单链表的每K个节点之间逆序
将单链表的每K个节点之间逆序
给定一个单链表的头节点head,实现一个调整链表的函数,使得每K 个节点之间逆序,如果最后剩下不够K 个节点,则不调整最后几个。
例如:
链表:1—>2—>3—>4—>5—>6—>7—>8—>null,k=3。
调整好后:3—>2—>1—>6—>5—>4—>7—>8—>null,其中7、8不调整,因为不够一组。
【解析】
1. 首先从左到右遍历链表,如果栈的大小不等于k ,则不断的入栈
2. 当栈的大小等于k 时,不断的出栈,并重新连接这些节点
3. 最后应该返回 newHead
package com.test; import com.test.ListNode; import java.util.Stack; /**
* Created by Demrystv.
*/
public class ReverseListNodeEveryK { /**
* 使用栈的数据结构,时间复杂度是O(N),空间复杂度是O(N)
*/
public ListNode reverseListNodeEveryK(ListNode head, int k){
if (k < 2){
return null;
}
Stack<ListNode> stack = new Stack<ListNode>();
ListNode newHead = head;
ListNode cur = head;
ListNode pre = null;
ListNode next = null;
while (cur != null){
next = cur.next;
stack.push(cur);
if (stack.size() == k){
pre = resign1(stack, pre, next);
// 举例说明可得证,例如k = 3
// 如果是1 2 ,那么不需要反转,程序也执行不到这个if里面来,所以返回的是 头节点
// 如果是1 2 3 4 ,当执行到3的时候,到了这个if里面,这时满足newHead==head,所以newHead就是3,符合反转后 3 2 1 4
// 如果是1 2 3 4 5 6 7,执行到3,newHead是3,执行到6,不满足newHead==head,所以newHead就是newHead,就是3,符合 3 2 1 6 5 4 7
// 真是巧妙呀!!!
newHead = newHead == head ? cur : newHead;
}
cur = next;
}
return newHead;
} private ListNode resign1(Stack<ListNode> stack, ListNode left, ListNode right){
ListNode cur = stack.pop();
if (left != null){
left.next = cur;
}
ListNode next = null;
while (!stack.isEmpty()){
next = stack.pop();
cur.next = next;
cur = next;
}
// 实际传入的这个right参数,是下一个K 范围内的第一个节点,不属于这个k 范围内。
// 确保与后面的相连
cur.next = right;
// 实际返回的这个cur 是这个K范围内的最后一个节点,即下一个k 的上一个节点,即pre 的意思
return cur;
}
}
栈和队列----将单链表的每K个节点之间逆序的更多相关文章
- 将单链表的每K个节点之间逆序
[说明]: 本文是左程云老师所著的<程序员面试代码指南>第二章中“将单链表的每K个节点之间逆序”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解析说明, ...
- 【链表问题】打卡9:将单链表的每K个节点之间逆序
前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获.每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢. 注:如果代码排版出现了问题麻烦通知我下 ...
- [算法] 将单链表的每K个节点之间逆序
题目 给定一个单链表的头结点,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点. 解答 使用栈结构 import java.util.Stack; pu ...
- 算法总结之 将单链表的每K个节点之间逆序
给定一个单链表的表头节点head,实现一个调整单链表的函数,是的每k个节点之间逆序,如果最后不够k个节点一组,则不调整最后几个节点 思路: 如果k的值小于2,不调整.k<1 没有意义,k==1代 ...
- 左神算法书籍《程序员代码面试指南》——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), 额外空间复杂度达到 ...
随机推荐
- python函数定义中引用外部变量的一个问题
如果在函数定义的默认值中引用了一个外部变量,如下所示 x = 3 def func(a = x): print(a, x) 那么a的默认值就会是3, 但是print语句中的x会是调用时的x值 lamb ...
- StarUML之一、UML的相关基本概念
为什么用UML 项目需要,在项目开发实现前期进行框架技术设计(条条大路通罗马通罗马,画图或者写代码都可以,适合就可以!). 用户的交互我们通常用Axure(原型设计)体现, 框架和功能结构设计则用UM ...
- SDMask(iOS蒙层遮罩弹出引导)
SDMask介绍 地址 针对iOS项目,大部分弹出视图三方都把弹出内容作为了项目的一部分,这种耦合局限性较大.该项目对此解耦,围绕我何时需要使用蒙层而展开设计.将弹出内容和动画和事件完全分离出去让co ...
- 表关联使用INNER JOIN实现更新功能
准备一些数据,创建2张表,表1为学生表: CREATE TABLE [dbo].[Student] ( [SNO] INT NOT NULL PRIMARY KEY, ) NOT NULL, ,) N ...
- 【mysql】索引相关的个人总结
重点参考: MySQL索引原理及慢查询优化 (美团技术分享网站):原理.示例优化都写的很好. 索引很难么?带你从头到尾捋一遍MySQL索引结构,不信你学不会!:原理写的很好. [从入门到入土]令人脱发 ...
- Centos7内核版安装nginx环境问题及解决方法
错误信息:./configure: error: C compiler cc is not found解决方案:yum -y install gcc gcc-c++ autoconf automake ...
- 【WPF学习】第十七章 鼠标输入
鼠标事件执行几个关联的任务.当鼠标移到某个元素上时,可通过最基本的鼠标事件进行响应.这些事件是MouseEnter(当鼠标指针移到元素上时引发该事件)和MouseLeave(当鼠标指针离开元素时引发该 ...
- C#设计模式学习笔记:(8)装饰模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7723225.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第三个模式--装 ...
- external IP 和 local IP 的区别
外部(external)和本地(local) IP地址都具有相同的用途,不同之处在于范围.整个Internet使用外部或公共IP地址来定位计算机系统和设备.专用网络内部使用本地或内部IP地址来定位与其 ...
- 剑指offer-面试题58_1-翻转单词顺序-字符串
/* 题目: 输入一个英文句子,翻转单词顺序,但单词内部顺序不变. */ /* 思路: 先翻转整个句子,再将每个单词分别翻转一次. */ #include<iostream> #inclu ...