算法笔记—链表、队列和栈
链表、队列和栈
- 1. 链表
- 1.1 单链表反转
- 1.2 双链表反转
- 1.3 合并两个有序链表
- 1.4 链表相加
- 1.5 划分链表
- 2. 队列和栈
- 2.1 循环队列
- 2.2 栈实现队列
- 2.3 队列实现栈
- 2.4 最小栈
- 2.2 双端队列
1. 链表
1.1 单链表反转
- 力扣 反转链表
// 反转单链表public ListNode reverseList(ListNode head) {ListNode pre = null;ListNode next = null;while (head != null) {next = head.next; // next指向head.next指的位置head.next = pre; // head.next指向pre指向的位置pre = head; // pre指向head指向的位置head = next; // head指向next指向的位置}return pre;}// 单链表节点定义public static class ListNode {public int val;public ListNode next;public ListNode(int val) {this.val = val;}public ListNode(int val, ListNode next) {this.val = val;this.next = next;}}
1.2 双链表反转
// 反转双链表public static DoubleListNode reverseDoubleList(DoubleListNode head) {DoubleListNode pre = null;DoubleListNode next = null;while (head != null) {next = head.next;head.next = pre;head.last = next;// 同时修改last指针即可pre = head;head = next;}return pre;}// 双链表节点public static class DoubleListNode {public int value;public DoubleListNode last;public DoubleListNode next;public DoubleListNode(int v) {value = v;}}
1.3 合并两个有序链表
- 力扣链接
// 合并两个有序链表public ListNode mergeTwoLists(ListNode head1, ListNode head2) {if (head1 == null || head2 == null) {return head1 == null ? head2 : head1;}//谁小谁做头ListNode head = head1.val <= head2.val ? head1 : head2; ListNode cur1 = head.next;// 另一个链表的头结点ListNode cur2 = head == head1 ? head2 : head1; // 已挂好(处理好)节点的前一个ListNode pre = head; // 只要都没完 谁小谁挂在pre之后while (cur1 != null && cur2 != null) {if (cur1.val <= cur2.val) {pre.next = cur1;cur1 = cur1.next;} else {pre.next = cur2;cur2 = cur2.next;}pre = pre.next;}// 若有一个链表结束 另一个剩余的挂在pre之后pre.next = cur1 != null ? cur1 : cur2; //剩余部分return head;}
1.4 链表相加
力扣 两数相加
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
- 请你将两个数相加,并以相同形式返回一个表示和的链表。
- 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
// 链表两数相加 没有复用老链表public ListNode addTwoNumbers(ListNode h1, ListNode h2) {ListNode ans = null, cur = null; // 初始化新链表int carry = 0; // 进位数 加法的进位只能为 0 或者 1for (int sum, val; // 声明变量h1 != null || h2 != null; // 循环条件h1 = h1 == null ? null : h1.next, // 每一轮h1的跳转h2 = h2 == null ? null : h2.next // 每一轮h2的跳转) {sum = (h1 == null ? 0 : h1.val)+ (h2 == null ? 0 : h2.val)+ carry; // 上一轮的进位// 组建新链表val = sum % 10; // 个位carry = sum / 10; // 进位if (ans == null) {ans = new ListNode(val);cur = ans;} else {cur.next = new ListNode(val);cur = cur.next;}}// 判断最后一位有无进位 若有则挂 1 节点if (carry == 1) {cur.next = new ListNode(1);}return ans;}
1.5 划分链表
力扣 分隔链表
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
- 你应当 保留 两个分区中每个节点的初始相对位置。
public static ListNode partition(ListNode head, int x) {ListNode leftHead = null, leftTail = null;ListNode rightHead = null, rightTail = null;ListNode next = null;// 终止条件while (head != null) {next = head.next; //记录一下下一位置 因为要断链head.next = null;// 小于范围if (head.val < x) {// set headif (leftHead == null) {leftHead = head;} else {leftTail.next = head;}// set tailleftTail = head;// 大于范围} else {if (rightHead == null) {rightHead = head;} else {rightTail.next = head;}rightTail = head;}head = next; // 处理下一节点}// 默认返回左头 这里对左头进行判断// 如果没有小于的 直接返回右头结点if (leftHead == null){return rightHead;}leftTail.next = rightHead;return leftHead;}// 单链表节点public static class ListNode {public int val;public Video_012.ListNode next;public ListNode(int val) {this.val = val;}public ListNode(int val, Video_012.ListNode next) {this.val = val;this.next = next;}}
2. 队列和栈
2.1 循环队列
力扣 设计循环队列
class MyCircularQueue {public int[] queue;public int l, r, size, limit;// 同时在队列里的数字个数,不要超过kpublic MyCircularQueue(int k) {queue = new int[k];l = r = size = 0;limit = k;}public boolean enQueue(int value) {if (isFull()) {return false;} else {queue[r] = value;// r++, 结束了,跳回0r = r == limit - 1 ? 0 : (r + 1);size++;return true;}}public boolean deQueue() {if (isEmpty()) {return false;} else {// l++, 结束了,跳回0l = l == limit - 1 ? 0 : (l + 1);size--;return true;}}public int Front() {if (isEmpty()) {return -1;} else {return queue[l];}}public int Rear() {if (isEmpty()) {return -1;} else {int last = r == 0 ? (limit - 1) : (r - 1);return queue[last];}}public boolean isEmpty() {return size == 0;}public boolean isFull() {return size == limit;}
}
2.2 栈实现队列
力扣
class MyQueue {public Stack<Integer> in;public Stack<Integer> out;public MyQueue() {in = new Stack<Integer>();out = new Stack<Integer>();}// 倒数据// 从in栈,把数据倒入out栈// 1) out空了,才能倒数据// 2) 如果倒数据,in必须倒完private void inToOut() {if (out.empty()) {while (!in.empty()) {out.push(in.pop());}}}public void push(int x) {in.push(x);inToOut();}public int pop() {inToOut();return out.pop();}public int peek() {inToOut();return out.peek();}public boolean empty() {return in.isEmpty() && out.isEmpty();}
}
2.3 队列实现栈
力扣
class MyStack {Queue<Integer> queue;public MyStack() {queue = new LinkedList<Integer>();}// O(n)public void push(int x) {int n = queue.size();queue.offer(x);for (int i = 0; i < n; i++) {queue.offer(queue.poll());}}public int pop() {return queue.poll();}public int top() {return queue.peek();}public boolean empty() {return queue.isEmpty();}
}
2.4 最小栈
力扣
class MinStack {public final int MAXN = 8001;public int[] data;public int[] min;int size;public MinStack() {data = new int[MAXN];min = new int[MAXN];size = 0;}public void push(int val) {data[size] = val;if (size == 0 || val <= min[size - 1]) {min[size] = val;} else {min[size] = min[size - 1];}size++;}public void pop() {size--;}public int top() {return data[size - 1];}public int getMin() {return min[size - 1];}
}
2.2 双端队列
力扣 设计循环双端队列
- 双向链表实现
// 双向链表实现// 常数操作慢,但是leetcode数据量太小了,所以看不出劣势class MyCircularDeque {public Deque<Integer> deque = new LinkedList<>();// Java自带的双向链表public int size;public int limit;public MyCircularDeque(int k) {size = 0;limit = k;}public boolean insertFront(int value) {if (isFull()) {return false;} else {deque.offerFirst(value);size++;return true;}}public boolean insertLast(int value) {if (isFull()) {return false;} else {deque.offerLast(value);size++;return true;}}public boolean deleteFront() {if (isEmpty()) {return false;} else {size--;deque.pollFirst();return true;}}public boolean deleteLast() {if (isEmpty()) {return false;} else {size--;deque.pollLast();return true;}}public int getFront() {if (isEmpty()) {return -1;} else {return deque.peekFirst();}}public int getRear() {if (isEmpty()) {return -1;} else {return deque.peekLast();}}public boolean isEmpty() {return size == 0;}public boolean isFull() {return size == limit;}}
- 数组实现
// 用数组实现,常数操作快// 但是leetcode数据量太小了,看不出优势/*数组长度为 k头部加入a, l==0 a放在k-1位置, l来到k-1l!=0 a放在l-1位置, l--头部弹出a, l==k-1 返回a l来到0l!=k-1 返回a l++尾部加入a r==k-1 a放在0位置 r来到0r!=k-1 a放在r+1位置 r++尾部弹出a, r==0 返回a, r来到k-1r!=0 返回a, r--*/class MyCircularDeque {public int[] deque;public int l, r, size, limit;public MyCircularDeque(int k) {deque = new int[k];l = r = size = 0;limit = k;}public boolean insertFront(int value) {if (isFull()) {return false;} else {if (isEmpty()) {l = r = 0;deque[0] = value;} else {// 头插 l-- 插入数值 边界判断l = l == 0 ? (limit - 1) : (l - 1);deque[l] = value;}size++;return true;}}public boolean insertLast(int value) {if (isFull()) {return false;} else {if (isEmpty()) {l = r = 0;deque[0] = value;} else {# 尾插 r++ 插入数值 边界判断r = r == limit - 1 ? 0 : (r + 1);deque[r] = value;}size++;return true;}}public boolean deleteFront() {if (isEmpty()) {return false;} else {l = (l == limit - 1) ? 0 : (l + 1);size--;return true;}}public boolean deleteLast() {if (isEmpty()) {return false;} else {r = r == 0 ? (limit - 1) : (r - 1);size--;return true;}}public int getFront() {if (isEmpty()) {return -1;} else {return deque[l];}}public int getRear() {if (isEmpty()) {return -1;} else {return deque[r];}}public boolean isEmpty() {return size == 0;}public boolean isFull() {return size == limit;}}
相关文章:

算法笔记—链表、队列和栈
链表、队列和栈 1. 链表1.1 单链表反转1.2 双链表反转1.3 合并两个有序链表1.4 链表相加1.5 划分链表 2. 队列和栈2.1 循环队列2.2 栈实现队列2.3 队列实现栈2.4 最小栈2.2 双端队列 1. 链表 1.1 单链表反转 力扣 反转链表 // 反转单链表public ListNode reverseList(ListNod…...

MySQL中的时间函数整理汇总
1.获取当前时间 -- 获取当前时间 SELECT NOW(); -- 获取当前日期 SELECT CURDATE(); -- 获取当前时分秒 SELECT CURTIME(); 2.获取对应日期对应的年/月/日/月份名/星期数 -- 返回对应日期对应的年/月/日/月份名/星期数 select year(now())as 年,month(now())as 月,day(now())…...

stu06-VSCode里的常用快捷键
Alt Z:文字自动换行。当一行的文字太长时,可以使用。或者查看→自动换行Alt Shift ↓ :快速复制当前行到下一行Alt Shift ↑ :快速复制当前行到上一行Alt B:在默认浏览器中打开当前.html文件Ctrl Enter…...

Bypass open_basedir
讲解 open_basedir是php.ini中的一个配置选项,可用于将用户访问文件的活动范围限制在指定的区域。 假设open_basedir/var/www/html/web1/:/tmp/,那么通过web1访问服务器的用户就无法获取服务器上除了/var/www/html/web1/和/tmp/这两个目录以外的文件。…...
【数据库设计和SQL基础语法】--查询数据--过滤
一、过滤数据 1.1 WHERE子句 基本条件过滤 使用比较运算符 在SQL中,基本条件过滤是通过使用比较运算符来限定检索的数据。以下是一些常用的比较运算符和它们的用法: 运算符说明示例等于 ()用于检索列中与指定值相等的行。示例:SELECT * FROM…...

关于git clone速度极慢的解决方法
!!!!前提条件:得有一个可靠且稳定的梯子,如果没有接下来的就不用看了 前言:我在写这篇文章前,也搜索过很多相关git clone速度很慢的解决方法,但是很多很麻烦,…...

软件设计不是CRUD(8):低耦合模块设计实战——组织机构模块(下)
接上文《软件设计不是CRUD(7):低耦合模块设计实战——组织机构模块(中)》 5、某项目研发团队进行扩展 上文中我们介绍了如何研发一个具有较低耦合强度的组织机构模块(包括模块的SDK和模块的默认本地数据库…...

docker-compose Install gitea
gitea 前言 Gitea 是一个轻量级的 DevOps 平台软件。从开发计划到产品成型的整个软件生命周期,他都能够高效而轻松的帮助团队和开发者。包括 Git 托管、代码审查、团队协作、软件包注册和 CI/CD。它与 GitHub、Bitbucket 和 GitLab 等比较类似。 Gitea 最初是从 Gogs 分支而来…...

【Pytorch】学习记录分享1——Tensor张量初始化与基本操作
1. 基础资料汇总 资料汇总 pytroch中文版本教程 PyTorch入门教程 B站强推!2023公认最通俗易懂的【PyTorch】教程,200集付费课程(附代码)人工智能_机器 视频 1.PyTorch简介 2.PyTorch环境搭建 basic: python numpy pandas pytroch…...

Python数据科学视频讲解:Python的数据运算符
2.9 Python的数据运算符 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解2.9节内容。本书已正式出版上市,当当、京东、淘宝等平台热销中,搜索书名即可。内容涵盖数据科学应用的全流程,包括数据科…...

参数学习——糖果问题(人工智能期末复习)
之前看了好久都不知道这题咋写,后来看了这篇机器智能-高频问题:糖果问题,大概看明白了,其实主要围绕着这两个公式 光看公式也看不懂,还是要结合题目来 己知有草莓味和酸橙味两种类型的糖果,分别放入5种不同…...

【深度学习】注意力机制(六)
本文介绍一些注意力机制的实现,包括MobileVITv1/MobileVITv2/DAT/CrossFormer/MOA。 【深度学习】注意力机制(一) 【深度学习】注意力机制(二) 【深度学习】注意力机制(三) 【深度学习】注意…...

螺旋矩阵算法(leetcode第59题)
题目描述: 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。示例 1:输入:n 3 输出:[[1,2,3],[8,9,4],[7,6,5]] 示例 2:输入&#…...

SQL Server 服务启动报错:错误1069:由于登录失败而无法启动服务
现象 服务器异常关机以后,SQL Server服务无法启动了。 启动服务时报错: 错误1069:由于登录失败而无法启动服务 解决办法 我的电脑–控制面板–管理工具–服务–右键MSSQLSERVER–属性–登录–登陆身份–选择"本地系统帐户" 设置完成后&am…...

“ABCD“[(int)qrand() % 4]作用
ABCD[(int)qrand() % 4] 作用 具体来说: qrand() 是一个函数,通常在C中用于生成一个随机整数。% 4 会取 qrand() 生成的随机数除以4的余数。因为4只有四个不同的余数(0, 1, 2, 3),所以这实际上会生成一个0到3之间的随…...
Vue2面试题:说一下组件通信有哪些方式?
父传子 1、自定义属性 props:在父组件中,给子组件绑定一个自定义属性,在子组件中,通过props进行接收 2、$parent:直接访问父组件实例的属性和方法 3、$attrs:在父组件中,给子组件绑定一个自定义…...

C# 两个日期比较大小
文章目录 C# 两个日期比较大小直接比较大小工具类DateTime.Compare C# 两个日期比较大小 直接比较大小 string ed "2023-12-13 09:27:59.000";//过去式DateTime nowDateTime DateTime.Now;DateTime expirationDate Convert.ToDateTime(ed);//质保期 长日期DateT…...

路由基本原理
目录 一、路由器概述 二、路由器的工作原理 三、路由表的形成 四、路由配置 1.连接设备 2.进入系统模式 3.进入接口模式 4.配置网络 5.下一跳的设置 6.设置浮动路由 7.设置默认路由 一、路由器概述 路由器(Router)是一种用于连接不同网络或子…...

配置本地端口镜像示例
镜像概念 定义 镜像是指将指定源的报文复制一份到目的端口。指定源被称为镜像源,目的端口被称为观察端口,复制的报文被称为镜像报文。 镜像可以在不影响设备对原始报文正常处理的情况下,将其复制一份,并通过观察端口发送给监控…...

使用FluentAvalonia组件库快速完成Avalonia前端开发
前言 工欲善其事必先利其器,前面我们花了几篇文章介绍了Avalonia框架以及如何在Avalonia框架下面使用PrismAvalonia完成MVV模式的开发。今天我们将介绍一款重磅级的Avalonia前端组件库,里面封装了我们开发中常用的组件,这样就不用我们自己再写组件了。专注业务功能开发,提…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...