将双向链表做简单的改造,即可实现一个FIFO(First Input First Out)队列,

该队列只在头节点出队,尾节点入队。

一般来说定义节点类只需一个后驱节点next即可。

这里保留pre节点,模拟一个已经入队的节点,如果需要取消,这样pre节点就是一个优势。

定义节点类:

/**
* 队列元素
*/
public class Node
{
private int data;//数据域
private Node pre;//指向上一个节点
private Node next;//指向下一个节点 public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public Node getPre() {
return pre;
}
public void setPre(Node pre) {
this.pre = pre;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
} //构造函数
public Node(int data, Node pre, Node next){
this.data = data;
this.pre = pre;
this.next = next;
}
public Node(int data){
this(data,null,null);
}
public Node(){
this(0,null,null);
} }

队列实现:

 1 /**
2 * Java双向链表实现队列(FIFO)
3 * Author:hangwei
4 * 2022/11
5 */
6 public class DQueue {
7 private Node head;
8 private Node tail;
9 private int size;
10 public Node getHead() {
11 return head;
12 }
13 public Node getTail() {
14 return tail;
15 }
16 public DQueue(){
17 tail = head = null;
18 size = 0;
19 }
20
21 //尾部入队
22 public void add(Node target){
23 if(target == null)
24 return;
25 if (size == 0) {
26 target.setPre(target);
27 target.setNext(target);
28 tail = head = target;
29 } else{
30 tail.setNext(target);//尾节点的下一个节点是新节点
31 target.setPre(tail);//新节点的上一个节点是尾节点
32 //标记新的尾节点
33 tail = target;
34 }
35 size++;
36 }
37
38 //头节点出队or取消某个已入队节点
39 public void romove(Node target){
40 if(size == 0){
41 System.out.println("null linked list ,can not delete.");
42 return;
43 }
44 else if(size == 1){
45 head = tail = null;
46 }
47 else if(target == null || target.equals(head)) {//target为空或头节点,则头出队
48 head = head.getNext();
49 head.setPre(null);
50 }
51 else {//移除队列中指定的元素
52 target.getPre().setNext(target.getNext());
53 target.getNext().setPre(target.getPre());
54 if(target.equals(tail))//如果出队是尾节点
55 tail=target.getPre();//标记新的尾节点
56 }
57 size--;
58 }
59
60 //打印队列
61 public void print(){
62 Node node = new Node();
63 node = head;
64 while (node.getNext() != head && node.getNext() != null){//遍历
65 System.out.print(node.getData());
66 System.out.print("<->");
67 node = node.getNext();
68 }
69 System.out.print(node.getData());//补充打印循环体的最后一个节点
70 System.out.println();
71 }
72 }

测试:

public class Main {
public static void main(String[] args) {
DQueue dq = new DQueue();
dq.add(new Node(111));
dq.add(new Node(222));
dq.add(new Node(333));
dq.add(new Node(444));
dq.add(new Node(555));
dq.print();
dq.romove(null);
dq.print();
dq.romove(dq.getHead().getNext());
dq.print();
}
}

执行结果:

*重点:使用双指针链表实现队列,可以很方便的移除队列中某个不需要的元素。

Java双向链表实现队列的更多相关文章

  1. Java多线程 阻塞队列和并发集合

    转载:大关的博客 Java多线程 阻塞队列和并发集合 本章主要探讨在多线程程序中与集合相关的内容.在多线程程序中,如果使用普通集合往往会造成数据错误,甚至造成程序崩溃.Java为多线程专门提供了特有的 ...

  2. Java 中的队列 Queue

    一.队列的定义 我们都知道队列(Queue)是一种先进先出(FIFO)的数据结构,Java中定义了java.util.Queue接口用来表示队列.Java中的Queue与List.Set属于同一个级别 ...

  3. java实现链队列

    java实现链队列的类代码: package linkqueue; public class LinkQueue { class Element { Object elem; Element next ...

  4. Java服务器端消息队列实战

    服务端口监听--报文接收--报文解码--业务处理--报文编码--写回客户端 从服务端与客户端成功握手并产生一个socket后,为了提高吞吐能力,接下来的事情就可以交给多线程去处理. 为了对接入的请求做 ...

  5. 使用goroutine+channel和java多线程+queue队列的方式开发各有什么优缺点?

    我感觉很多项目使用java或者c的多线程库+线程安全的queue数据结构基本上可以实现goroutine+channel开发能达到的需求,所以请问一下为什么说golang更适合并发服务端的开发呢?使用 ...

  6. java中有界队列的饱和策略(reject policy)

    文章目录 AbortPolicy DiscardPolicy DiscardOldestPolicy CallerRunsPolicy 使用Semaphore java中有界队列的饱和策略(rejec ...

  7. Java集合--阻塞队列及各种实现的解析

    阻塞队列(Blocking Queue) 一.队列的定义 说的阻塞队列,就先了解下什么是队列,队列也是一种特殊的线性表结构,在线性表的基础上加了一条限制:那就是一端入队列,一端出队列,且需要遵循FIF ...

  8. Java:阻塞队列

    Java:阻塞队列 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 1. 概述 概念 队列 队列就可以想成是一个数组,从一头进入,一头出去,排队买饭 阻塞队列 B ...

  9. Java并发--阻塞队列

    在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList),这些工具都为我们编写多线程程 ...

  10. java代码实现队列的优化

    package com.voole.queun; /** * @Decription 队列 * @author TMAC-J * */ public class Queun { /** * 初始化队列 ...

随机推荐

  1. Using Semaphores in Delphi, Part 2: The Connection Pool

    Abstract: Semaphores are used to coordinate multiple threads and processes. That semaphores provide ...

  2. golang sync.RWMutex总结笔记

    背景 最近项目中遇到两次RWMutex死锁问题,所以稍微看了一下资料和源码,稍作记录 源码 type RWMutex struct { w Mutex // held if there are pen ...

  3. Java基础知识题

    在Java语言中,已知 a 为int 型,b 为 double型,c 为 float 型,d 为 char 型,则表达式 a+b*c-d/a 的 结果类型为(选一项)A.intB.doubleC.fl ...

  4. java相关部分配置

    一.mybatis逆向工程 ① generator.properties jdbc.driverLocation=D:/testDir/Maven/repository_g/mysql/mysql-c ...

  5. You need to run build with JDK or have tools.jar on the classpath.If this occures during eclipse build make sure you run eclipse under JDK as well 错误

    我打开项目报错是这样的  pom.xml jdk配置什么的都是好的    但是还是报错 解决错误 : 1.打开你eclipse的根目录,找到eclipse.ini  这个文件夹打开 2.打开是这个样子 ...

  6. 实验二:Open vSwitch虚拟交换机实践

    基础要求提交 a) /home/用户名/学号/lab2/目录下执行ovs-vsctl show命令.以及p0和p1连通性测试的执行结果截图: b) /home/用户名/学号/lab2/目录下开启Min ...

  7. ACM 的正确入门方式是什么?

    作者:数学lover 链接:https://www.zhihu.com/question/51727516/answer/127265733 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权, ...

  8. Oracle-账户被锁:The account is locked

    Oracle-账户被锁:The account is locked cmd-->sqlplus--> 管理员登录:system@ORCL 密码:1 然后输入:alter user kjb( ...

  9. 同步协程的必备工具: WaitGroup

    1. 简介 本文将介绍 Go 语言中的 WaitGroup 并发原语,包括 WaitGroup 的基本使用方法.实现原理.使用注意事项以及常见的使用方式.能够更好地理解和应用 WaitGroup 来协 ...

  10. 钛度守望者旗舰版TSG550鼠标(原相3335芯片)拆解

    鼠标整体外观 鼠标按键支柱,采用的十字形的按键柱,没有采用现在市面上多数鼠标的平面贴片形的按键柱设计,但是耐用性比一字型的按键柱会好很多. 可换微动设计,原装的是凯华GM8.0黑曼巴8000万次微动, ...