【数据结构与算法 | 基础篇】双向循环链表模拟双端队列

1. 前言

  • 前文我们分别用链表,数组来实现了栈和队列. 而双端队列可以替代栈和队列并达到二者的效果.
  • 我们知道,栈的特点是只在栈顶操作元素,队列的特点是在队头pop元素,在队尾push元素. 而双端队列可以在队头和队尾分别进行pop与push操作.
  • 双端队列接口(Deque)有两个主要实现类,其一是ArrayDeque, 其二是LinkedList.本文我们主要探讨用双向循环链表来实现Deque接口,达到LinkedList的效果.
  • 为什么要使用双向循环链表,而不是使用双向链表呢?因为我们要对该数据结构进行头尾的操作.为了方便对队头队尾的操作,我们往往会在队头队尾添加哨兵节点,方便我们删除队头队尾元素.如果我们使用双向链表,我们需要在队头和队尾分别设置一个哨兵节点.而我们使用双向循环链表,只需设置一个哨兵节点即可.

2. 双向循环链表模拟双端队列

(1). Deque接口

public interface MyDeque<E>{boolean offerFirst(E e);boolean offerLast(E e);E pollFirst();E pollLast();E peekFirst();E peekLast();boolean isEmpty();boolean isFull();}

(2). 模拟双端队列

//双向链表模拟双端队列
public class MyLinkedList<E> implements MyDeque<E>, Iterable<E> {//Node内部类private static class Node<E> {Node<E> prev;E value;Node<E> next;public Node(Node<E> prev, E value, Node<E> next) {this.prev = prev;this.value = value;this.next = next;}}//哨兵节点Node<E> sential = new Node<>(null, null, null);//头节点Node<E> head = sential;//尾节点Node<E> tail = sential;//双端队列的容量private int capacity;//双端队列的实际大小private int size;public MyLinkedList(int capacity) {this.capacity = capacity;sential.prev = sential;sential.next = sential;}@Overridepublic boolean offerFirst(E e) {//如果双端队列已经满了, 加入失败if(isFull()) {return false;}Node<E> p = new Node<>(sential, e, sential.next);sential.next = p;size++;return true;}@Overridepublic boolean offerLast(E e) {if(isFull()) {return false;}Node<E> p = new Node<>(tail, e, sential);tail.next = p;tail = p;size++;return true;}@Overridepublic E pollFirst() {//如果双端队列已空if (isEmpty()) {return null;}Node<E> p = sential.next;sential.next = p.next;p.next.prev = sential;size--;return p.value;}@Overridepublic E pollLast() {if(isEmpty()) {return null;}Node<E> p = tail.prev;p.next = sential;E value = tail.value;tail = p;size--;return value;}@Overridepublic E peekFirst() {if (isEmpty()) {return null;}return sential.next.value;}@Overridepublic E peekLast() {if(isEmpty()) {return null;}return tail.value;}@Overridepublic boolean isEmpty() {//当head与tail指针都指向了哨兵节点时, 此时双端队列为空return head == tail;}@Overridepublic boolean isFull() {return size > capacity;}@Overridepublic Iterator<E> iterator() {return new Iterator<E>() {Node<E> p = sential.next;@Overridepublic boolean hasNext() {return p != sential;}@Overridepublic E next() {E value = p.value;p = p.next;return value;}};}
}

3. 单元测试

public class MyLinkedListTest {@Testpublic void test1() {MyLinkedList<Integer> deque = new MyLinkedList<>(10);deque.offerFirst(1);deque.offerFirst(2);deque.offerFirst(3);deque.offerFirst(4);deque.offerFirst(5);deque.offerFirst(6);for (Integer element : deque) {System.out.print(element + " ");}//6 5 4 3 2 1}@Testpublic void test2() {MyLinkedList<Integer> deque = new MyLinkedList<>(10);deque.offerLast(1);deque.offerLast(2);deque.offerLast(3);deque.offerLast(4);deque.offerLast(5);deque.offerLast(6);for(Integer element : deque) {System.out.print(element + " ");}}
}

 

 

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

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

相关文章

Python 新手最容易踩的坑

Python新手最容易踩的坑 缩进错误忘记引入模块使用未定义的变量不理解变量作用域字符串格式化错误乱用关键字多余的符号本期图书推荐&#xff1a;Python算法小讲堂---39个算法案例带你玩转Python内容简介获取方式 在学习 Python 的过程中&#xff0c;新手往往会遇到一些常见的陷…

如何用pyecharts工具制作动态变化柱状图

# # # 导入柱状图的包 # from pyecharts.charts import Bar # # # 创建一个柱状图 # bar1 Bar() # bar1.add_xaxis(["中国", "美国", "英国"]) # bar1.add_yaxis("1900年GDP总量", [10, 20, 30]) # # # 生成图 # bar1.render() # # #…

5月23日零钱兑换+组合总和Ⅳ

377.组合总和Ⅳ 给你一个由 不同 整数组成的数组 nums &#xff0c;和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3], target 4 输出&#xf…

全免费的数据恢复工具哪个好?分享2024年性价比超高的12款数据恢复软件!

当您丢失重要文件时&#xff0c;您应该可不想遇到措手不及的情况吧&#xff1f;相反&#xff0c;您需要在系统中使用一些可靠的数据恢复软件&#xff0c;但是全免费的数据恢复工具哪个好呢&#xff1f;别担心&#xff0c;本文将帮助您选择最适合您的解决方案。 如何挑选一款合适…

后端开发面试题3(附答案)

前言 在下首语言是golang,所以会用他作为示例。 原文参见 @arialdomartini的: Back-End Developer Interview Questions 设计模式相关问题 1. 请用一个例子表明,全局对象是邪恶的存在。 在Go语言中,虽然没有传统意义上的全局变量(全局对象),但可以通过包级别的变量来模…

【Rust日报】嵌入式 Rust:一份简化指南

EvilHelix 编辑器 EvilHelix 是一个采用 Vim 风格的模态编辑器&#xff0c;旨在提供快速且高效的编辑体验。它是 Helix 编辑器的一个分支&#xff0c;增加了 Vim binding&#xff0c;同时积极同步上游的特性&#xff0c;兼备了 Vim 和 Hexli 的优点&#xff1a; Vim 风格的模态…

blkio限制容器iops

/sys/fs/cgroup/blkio/blkio.throttle.read_iops_device /sys/fs/cgroup/blkio/blkio.throttle.write_iops_device lsblk 查看设备 kubectl get pod xxx -oyaml | grep -i id find / -name blkio.throttle.write_iops_device | grep id

栈和队列OJ题详解

一.有效的括号&#xff1a; 20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 首先拿到这个题目&#xff0c;我的第一个思路是利用双指针来走&#xff0c;看看是不是匹配的 但是这种情况就把双指针的这个思路直接pass了&#xff0c;明明是匹配的括号&#xff0c;用双指…

1.3 Windows 的 CLion 开发环境安装

目录 1 C 语言的那些事 2 开发环境安装及新建项目 2.1 安装 MinGW 编译器 2.2 安装 CLion 开发环境

Android Audio基础——AudioFlinger回放录制线程(七)

AndioFlinger 作为 Android 的音频系统引擎,重任之一是负责输入输出流设备的管理及音频流数据的处理传输,这是由回放线程 PlaybackThread 及其派生的子类和录制线程 RecordThread 进行的。 一、基础介绍 1、关系图 ThreadBase:PlaybackThread 和 RecordThread 的基类。 Re…

人工智能最新的新闻动态

一、AI交互内容创新国际竞赛启动 主办单位&#xff1a;南京市科协启动时间&#xff1a;2024年5月26日目的与意义&#xff1a;鼓励全球科技人才参与AI创新&#xff0c;拓宽南京与海外科技人才的交流渠道&#xff0c;注入国际化活力&#xff0c;推动AI技术创新应用&#xff0c;挖…

react diff 原理

React的Diff算法&#xff08;也称为React Diff原理或React Diffing策略&#xff09;是React框架中用于优化DOM更新的核心机制。其核心思想是通过比较新旧Virtual DOM的差异&#xff0c;仅更新有变化的部分&#xff0c;以提高渲染效率。以下是React Diff算法的主要原理和策略&am…

【linux】多线程(2)

文章目录 线程的应用生产消费者模型自制锁生产消费队列成员参数生产函数消费函数 任务处理方式主函数 POSIX信号量sem_wait()sem_post() 线程池应用场景示例 单例模式饿汉实现单例 吃完饭, 立刻洗碗, 这种就是饿汉方式. 因为下一顿吃的时候可以立刻拿着碗就能吃饭.懒汉实现单例…

visual studio code生成代码模板

编写需要生成代码片段的代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wid…

【C++】二分查找算法:x的平方根

1.题目 2.算法思路 看到题目可能不容易想到二分查找。 这题考察我们对算法的熟练程度。 二分查找的特点&#xff1a;数组具有二段性(不一定有序)。 题目中没有数组&#xff0c;我们可以造一个从0到x的数组&#xff0c;然后利用二分查找找到对应的值即可。 3.代码 class S…

ionic关于@angular版本报错解决方案(有效)

最近学校要求使用ionicangular学习&#xff0c;但是出现下面问题&#xff0c;这里我就分享一个我亲测有效的解决方案&#xff0c;提供学习&#xff08;在VScode中&#xff09; npm error code ERESOLVE npm error ERESOLVE could not resolve npm error npm error While resol…

C语言生成正弦波测试数据易懂版本

以往生成正弦波数据, 各个参数之间的关系总是不明确, 现在这个函数的代码非常明确的区分了各个参数之间的相互关系. #include <stdio.h> #include <math.h>/*** brief 生成正弦波测试数据* * param data 存放生成的数据的数组* param n 数据的长度 一共采样了多少…

源码编译安装LAMP(安装apeche mysql php 论坛 网站 巨详细版)

目录 一.LAMP架构相关概述 1.各组件作用 Linux&#xff08;平台&#xff09; Apache&#xff08;前台&#xff09; MySQL&#xff08;后台&#xff09; PHP/Perl/Python&#xff08;中间连接&#xff09; 总结 二.编译安装Apache httpd服务 1.关闭防火墙&#xff0c;将…

解决SpringBoot中插入汉字变成?(一秒解决)

在这里url后面加一行配置即可&useUnicodetrue&characterEncodingUTF-8即可 解释 spring.datasource.url: 这里包含了数据库的URL&#xff0c;以及额外的参数如useUnicodetrue用于启用Unicode字符集支持&#xff0c;characterEncodingUTF-8用于指定字符编码为UTF-8&…

Java面向对象-常用类(Math类)

常用类-Math类 Math 类提供了一序列基本数学运算和几何函数的方法。 Math类是类&#xff0c;并且它的所有成员变量和成员方法都是静态的。 1 Math类的常量和常用方法 常量 static doubleE 比任何其他值都更接近 e&#xff08;即自然对数的底数&#xff09;的 double 值。stati…