算法笔记—链表、队列和栈

链表、队列和栈

  • 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<>();public int size;public int limit;public MyCircularDeque1(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数据量太小了,看不出优势class MyCircularDeque {public int[] deque;public int l, r, size, limit;public MyCircularDeque2(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 == 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 == 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;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/219446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【RTOS学习】模拟实现任务切换 | 寄存器和栈的变化

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f3c0;认识任务切换&#x1f3d0;切换的实质&#x1f3d0;栈中的内容&#x1f3d0;切…

基于ssm的前后端分离鲜花销售系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本鲜花销售系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

java中的包

1.包的本质分析(原理) 包的本质 实际上就是创建不同的文件夹来保存类文件 2.一个文件中有两个类的i情况 package com.use;import com.xiaoqiang.Dog;public class Test {public static void main(String[] args) {Dog dog new Dog();System.out.println(dog); //com.xiaoqian…

最新版ES8的client API操作 Elasticsearch Java API client 8.0

作者&#xff1a;ChenZhen 本人不常看网站消息&#xff0c;有问题通过下面的方式联系&#xff1a; 邮箱&#xff1a;1583296383qq.comvx: ChenZhen_7 我的个人博客地址&#xff1a;https://www.chenzhen.space/&#x1f310; 版权&#xff1a;本文为博主的原创文章&#xff…

“京东API接口技术大揭秘:让你轻松驾驭电商开发!“

京东平台API接口技术贴 一、概述 京东平台提供了丰富的API接口&#xff0c;方便开发者进行应用开发。这些API接口涵盖了商品信息、订单管理、用户认证等多个方面&#xff0c;为开发者提供了强大的支持。本文将详细介绍京东平台API接口的技术细节和使用方法。 二、API接口概述…

回归预测 | MATLAB实现CHOA-BiLSTM黑猩猩优化算法优化双向长短期记忆网络回归预测 (多指标,多图)

回归预测 | MATLAB实现CHOA-BiLSTM黑猩猩优化算法优化双向长短期记忆网络回归预测 &#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现CHOA-BiLSTM黑猩猩优化算法优化双向长短期记忆网络回归预测 &#xff08;多指标&#xff0c;多图&#xff09;效果…

CMake是什么

文章目录 一.什么是CMake二.CMake安装三.CMake一个HelloWord-的语法介绍3.1 PROJECT关键字3.2 SET关键字3.3 MESSAGE关键字3.4 ADD_EXECUTABLE关键字3.5 include_directories关键字3.6 aux_source_directory 四.语法的基本原则4.1 语法注意事项 五.内部构建和外部构建5.1 外部构…

dialog 在xml文件进行了自适应宽,但是失效了

如下图 讲述了为什么已经设置好了dialog的宽高 到了显示的时候就会失效的原因 解决方式 &#xff1a; 在自定的dialog中的onstart()方法中进行重新设置宽高 Window window getWindow();WindowManager.LayoutParams lp window.getAttributes();lp.height LinearLayout.La…

【操作系统的IO模型有哪些?】

操作系统的IO模型有哪些&#xff1f; 操作系统中的IO模型逐一拓展同步阻塞IO模型同步非阻塞IO模型IO复用模型信号驱动IO模型异步IO模型 操作系统中的IO模型 为了保护操作系统的安全&#xff0c;通过缓存加快系统读写&#xff0c;会将内存分为用户空间和内存空间两个部分。如果…

想学精MySQL,得先捋一捋高可用架构

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

ARM day8

1.题目&#xff1a;主机获取从机里面的温湿度数据&#xff0c;并打印出来 结果&#xff1a; 代码&#xff1a; main.c #include "iic.h"#include "si7006.h"void delay(int ms){int i,j;for(i0;i<ms;i){for(j0;j<2000;j);}}int main(){short tem;…

关于“Python”的核心知识点整理大全11

目录 ​编辑 6.2.4 修改字典中的值 6.2.5 删除键—值对 注意 删除的键—值对永远消失了。 6.2.6 由类似对象组成的字典 6.3 遍历字典 6.3.1 遍历所有的键—值对 6.3.2 遍历字典中的所有键 往期快速传送门&#x1f446;&#xff08;在文章最后&#xff09;&#xff1a; 6.…

【网络编程之初出茅庐】

前言&#xff1a;本章主要先讲解一些基本的网络知识&#xff0c;先把基本的知识用起来&#xff0c;后续会更深入的讲解底层原理。 网络编程的概念 网络编程&#xff0c;指网络上的主机&#xff0c;通过不同的进程&#xff0c;以编程的方式实现网络通信&#xff08;或称为网络数…

网络基础(九):VLAN的概述及配置

目录 前言 一、分割广播域的方法 二、VLAN 1、VLAN的概述及优势 1.1VLAN的概述 1.2VLAN的优势 2、VLAN的种类 3、VLAN的三种端口类型 4、VLAN 的工作原理 4.1VLAN数据帧 4.2VLAN的范围 4.2VLAN的access类型工作原理 4.3VLAN的trunk类型工作原理 4.4VLAN的Hybird类…

CentOS7安装MySQL8.0

一、使用Yum安装 1. 使用wget下载MySQL的rpm包 wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm2. 安装下载好的rpm包 yum localinstall mysql80-community-release-el7-3.noarch.rpm 3. 安装mysql&#xff08;该步可能出现问题&#xff09; yum…

JAVAEE-8-线程池

池 我们之前也接触过,比如说常量池,数据库连接池,线程池,进程池,内存池等等, 池的共性: 1.提前把要用的对象准备好 2.把用完的对象也不要立即释放,先留着以备下次使用 来提高效率!!! 最开始,进程能够解决并发编程的问题,因为频繁创建销毁进程的开销成本太大了,所以我们引…

新版Spring Security6.2案例 - Basic HTTP Authentication

前言&#xff1a; 书接上文&#xff0c;翻译官网Authentication的Username/Password这页&#xff0c;接下来继续翻译basic的这页&#xff0c;因为官网说的都是原理性的&#xff0c;这边一个小案例关于basic http authentication。 Basic Authentication 本节介绍 HTTP 基本身…

Unity 通过鼠标控制模拟人物移动和旋转视角

要通过鼠标控制并模拟人物移动和转换视角&#xff0c;将会使用射线检测、鼠标点击和鼠标水平移动&#xff0c;配合物体旋转和移动方法共同实现。 首先搭建个由一个Plane地板和若干cube组成的简单场景&#xff1a; 其次创建一个Capsule作为移动物体&#xff0c;并把摄像头拉到该…

腾讯云优惠券领取指南

腾讯云优惠券是降低云服务成本的有效手段&#xff0c;无论是新用户还是老用户&#xff0c;都可以通过下面方法领取到适合自己的优惠券。 1、腾讯云优惠券领取 领取入口&#xff1a;txy.ink 2、腾讯云优惠券介绍 腾讯云优惠券包括代金券和折扣券&#xff0c;代金券可以在结算…

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 CNN 部分

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 CNN 部分 概述CNN 简介数据预处理查看数据格式加载数据集 图像处理限定图像范围图像转换加载数据 CNN 模型Inception 网络ResNet 残差网络总结参数设置 训练 Train模型初始化数据加载训练超参数训练循环 验证…