首页 > 其他分享 >双链表实现双端队列

双链表实现双端队列

时间:2022-12-19 19:12:48浏览次数:47  
标签:head 队列 双端 tail ans 双链 null public

双链表实现双端队列

双端队列是一个从两端都可以进行进队出队的队列。

代码:

/**
 * 使用双链表实现双端队列
 * 双端队列也就是在队列的两端都可以进行出队列以及入队列
 */
public class DoubleLinkedListImplementsDeQueue {
    //1.首先定义一个双端队列的节点信息类
    public static class Node<V> {
        public V value;
        public Node<V> last;
        public Node<V> next;
        public Node(V v) {
            value = v;
            last = null;
            next = null;
        }
    }
    public static class MyDeque<V> {
        private Node<V> head;
        private Node<V> tail;
        private int size;

        public MyDeque() {
            head = null;
            tail = null;
            size = 0;
        }
        //1.判断双端队列是否为空
        public boolean isEmpty() {
            return size == 0;
        }
        //2.双端队列的大小
        public int size() {
            return size;
        }
        //3.双端队列从头开始入队列
        public void pushHead(V value) {
            //1.首先定义一个节点信息用以保存入队列的节点信息
            Node<V> cur = new Node<>(value);
            //2.如果队列为空那么头和尾都指向刚进入队列的节点
            if (head == null) {
                head = cur;
                tail = cur;
            } else {
                //双端队列不为空
                cur.next = head;
                head.last = cur;
                head = cur;
            }
            size++;
        }
        //4.双端队列尾部进入队列
        public void pushTail(V value) {
            Node<V> cur = new Node<>(value);
            if (head == null) {
                head = cur;
                tail = cur;
            } else {
                tail.next = cur;
                cur.last = tail;
                tail = cur;
            }
            size++;
        }
        //5.头部出队列
        public V pollHead() {
            //1.定义一个变量用以存储出队列节点的值
            V ans = null;
            if (head == null) {
                return ans;
            }
            size--;
            ans = head.value;
            //如果队列中只有一个节点那么出队列后需要将头尾都置为空
            if (head == tail) {
                head = null;
                tail = null;
            } else {
                //队列不止一个节点
                head = head.next;
                head.last = null;
            }
            return ans;
        }
        //6.从尾部出节点
        public V pollTail() {
            V ans = null;
            if (head == null) {
                return ans;
            }
            size--;
            ans = tail.value;
            if (head == tail) {
                head = null;
                tail = null;
            } else {
                tail = tail.last;
                tail.next = null;
            }
            return ans;
        }
        //7.获取头节点信息的值
        public V peekHead() {
            V ans = null;
            if (head != null) {
                ans = head.value;
            }
            return ans;
        }
        //8.获取尾部节点信息的值
        public V peekTail() {
            V ans = null;
            if (tail != null) {
                ans = tail.value;
            }
            return ans;
        }
    }
}

标签:head,队列,双端,tail,ans,双链,null,public
From: https://www.cnblogs.com/ygstudy/p/16992860.html

相关文章

  • 单链表与队列和栈
    单链表与队列和栈使用单链表实现队列队列是一个先进先出的数据结构,它包括进队、出队、获取队列大小等功能。代码:/***使用单链表实现队列*队列是一个先进先出的......
  • 基础算法汇总之堆和优先队列
    一.简述这篇文章将介绍几种常见的队列,本文将重点介绍优先队列以及优先队列底层的二叉堆并且实现基础算法(go实现),最后还会介绍一样Java并发包中的四种最常用的队列,分析其源码......
  • [leetcode]第 1 天 栈与队列(简单)
    09用两个栈实现队列思路栈:先进后出要求:先进先出。在队尾加,从队首删假设有栈A栈B,添加时压入栈A,删除时将栈A元素出栈,压入栈B,实现倒序,进而实现从队首删classCQueue{......
  • 如何处理消息队列消费过程中的重复消息
    在MQTT协议中,给出了三种传递消息时能够提供的服务质量标准,这三种服务质量从低到高依次是:​​Atmostonce​​:至多一次。消息在传递时,最多会被送达一次。换一个说法就......
  • 基于消息队列实现分布式事务
    注意:本文把消息队列与购物车系统看作同一个事务目标:掌握消息队列的事务场景:订单系统产生订单,购物车系统减购物车中的商品。实现思路:订单系统在消息队列上开启一个事务......
  • 队列总结_legend
    队列总结:Queue (1)队列的基本知识:        (1.1)特点:尾进头出,先进先出。(rearinfrontout)         (1.2)与线性表比较:        队列......
  • 架构设计(六):引入消息队列
    架构设计(六):引入消息队列作者:Grey原文地址:博客园:架构设计(六):引入消息队列CSDN:架构设计(六):引入消息队列消息队列是一个支持持久化的组件,数据存储在内存中,支持异步通信。它......
  • cpp优先队列(priority_queue)
    优先队列的概念在优先队列中,队列中的每个元素都与某个优先级相关联,但是优先级在队列数据结构中不存在。优先队列中具有最高优先级的元素将被首先删除,而队列遵循FIFO(......
  • 单调队列——本质上和单调栈是一样的思路
    算法学习笔记(66):单调队列https://zhuanlan.zhihu.com/p/346354943“如果一个选手比你小还比你强,你就可以退役了。”——单调队列的原理好久没写笔记了,先补......
  • java集合类——Stack栈类与Queue队列
      今日走读代码时,遇到stack栈类,特查看java的API文档,总结如下:Stack继承Vector类,它通过五个操作对类Vector进行了扩展。栈是后进先出的。栈提供了通常的push和pop......