基于双链表 实现Java Queue队列

除了可以通过一维数组,单链表实现queue队列,还可以通过双链表实现queue队列。

在基于NLNode类实现双向链表的时候,为了使编程更加简洁,通常我们都要在最前端和最后端各设置一个哑元节点( Dummy node )。这两个节点分别称作头节点( Header node )和尾节点( Trailer node) ㈠,起哨兵( Sentinel)的作用。也就是说,它们并不存储任何实质的数据对象,头(尾)节点的next( prev)引用指向首(末)节点,而prev(next)引用为空。如此构成的双向链表结构,如下代码示:

Java代码:

DoubleNode 类:

package com.doub.list;

/**
 * 
 * @author gannyee
 *
 */
public class DoubleNode {

    //Declared element
    private Object element;
    //Declared prior
    private DoubleNode prior;
    //Declared next
    private DoubleNode next;

    //Constructor 
    public DoubleNode(){
        this(null,null,null);
    }

    public DoubleNode(DoubleNode prior,Object element, DoubleNode next){
        this.prior = prior;
        this.element = element;
        this.next = next;
    }
    //Get element
    public Object getElement() {
        return element;
    }

    //Set element
    public void setElement(Object element) {
        this.element = element;
    }

    //Get prior
    public DoubleNode getPrior() {
        return prior;
    }

    //Set prior
    public void setPrior(DoubleNode prior) {
        this.prior = prior;
    }

    //Get next
    public DoubleNode getNext() {
        return next;
    }

    //Set next
    public void setNext(DoubleNode next) {
        this.next = next;
    }

}

DoubleListQueue 类:

package com.doub.list;

import java.util.Arrays;

import com.queue.ExceptionQueueEmpty;

public class DoubleListQueue {

    // Declared head
    private static DoubleNode head;
    // Declared rear
    private static DoubleNode rear;
    // Declared size;
    private static int size;
    //Declared length
    private static int length;
    // Constructor
    public DoubleListQueue() {
        //initialize  
        head = new DoubleNode();
        rear = new DoubleNode();

        head.setNext(rear);
        head.setPrior(null);
        rear.setNext(null);
        rear.setPrior(head);
        this.size = this.length = 0;
    }

    // Get size
    public int getSize() {
        return size;
    }

    //Get length
    public int length(){
        return length;
    }

    // Is empty
    public boolean isEmpty() {
        return size == 0;
    }

    // Insert element in first position
    public void insertFirst(Object element) {
        DoubleNode newNode = new DoubleNode(head,element,head.getNext());
        head.getNext().setPrior(newNode);
        head.setNext(newNode);
        size ++;
        length = size;
    }

    // Insert element in last position
    public void insertLast(Object element) {
        DoubleNode newNode = new DoubleNode(rear.getPrior(),element,rear);
        rear.getPrior().setNext(newNode);
        rear.setPrior(newNode);
        size ++;
        length = size;
    }

    // Remove element from first position
    public void removeFirst() throws ExceptionQueueEmpty{
        if(isEmpty())
            throw new ExceptionQueueEmpty("Queue is empty");
        head.getNext().getNext().setPrior(head);
        head.setNext(head.getNext().getNext());
        size --;
    }

    // Remove element from last position
    public void removeLast() throws ExceptionQueueEmpty{
        if(isEmpty())
            throw new ExceptionQueueEmpty("Queue is empty");
        rear.getPrior().getPrior().setNext(rear);
        rear.setPrior(rear.getPrior().getPrior());
        size --;
    }

    // Get first node but not isn't deletion
    public Object getFirst() throws ExceptionQueueEmpty{
        if(isEmpty())
            throw new ExceptionQueueEmpty("Queue is empty");
        return head.getNext().getElement();
    }

    // Get last node but not isn't deletion
    public Object getLast() throws ExceptionQueueEmpty{
        if(isEmpty())
            throw new ExceptionQueueEmpty("Queue is empty");
        return rear.getPrior().getElement();
    }

    //Get all element
    public void getAllElements(){
        Object[] array = new Object[getSize()];

        DoubleNode travelNode = new DoubleNode();
        travelNode = head.getNext();
        for(int i = 0; travelNode != rear;i ++){
            array[i] = travelNode.getElement();
            travelNode = travelNode.getNext();
        }
        System.out.println("All elements are: " + Arrays.toString(array));
    }
}

DoubleListQueueTest 类:

package com.doub.list;

import com.queue.ExceptionQueueEmpty;

/**
 * 
 * @author gannyee
 *
 */
public class DoubleListQueueTest {

    public static void main(String[] args) throws ExceptionQueueEmpty {
        DoubleListQueue dlq = new DoubleListQueue();

        System.out.println("Size: " + dlq.getSize());
        System.out.println("Is empty? " + dlq.isEmpty());

        for(int i = 0;i < 6;i ++){
            dlq.insertFirst(i);
        }

        System.out.println("Size: " + dlq.getSize());
        System.out.println("Is empty? " + dlq.isEmpty());
        dlq.getAllElements();
        System.out.println(dlq.getFirst());
        System.out.println(dlq.getLast());

        for(int i = 0;i < 6;i ++){
            dlq.insertLast(i + 1);
        }

        System.out.println("Size: " + dlq.getSize());
        System.out.println("Is empty? " + dlq.isEmpty());
        dlq.getAllElements();
        System.out.println(dlq.getFirst());
        System.out.println(dlq.getLast());

        for(int i = 0;i < 6;i ++){
            dlq.removeFirst();
        }

        System.out.println("Size: " + dlq.getSize());
        System.out.println("Is empty? " + dlq.isEmpty());
        dlq.getAllElements();
        System.out.println(dlq.getFirst());
        System.out.println(dlq.getLast());

        for(int i = 0;i < 6;i ++){
            dlq.removeLast();
        }

        System.out.println("Size: " + dlq.getSize());
        System.out.println("Is empty? " + dlq.isEmpty());
        dlq.getAllElements();
    }

}

测试结果:

Size: 0
Is empty? true
Size: 6
Is empty? false
All elements are: [5, 4, 3, 2, 1, 0]
5
0
Size: 12
Is empty? false
All elements are: [5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6]
5
6
Size: 6
Is empty? false
All elements are: [1, 2, 3, 4, 5, 6]
1
6
Size: 0
Is empty? true
All elements are: []

参考文献:数据结构与算法( Java 描述)邓俊辉 著

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/* * 基于双向链表实现双端队列结构 */ package dsa; public class Deque_DLNode implements Deque { protected DLNode header;//指向头节点(哨兵) protected DLNode trailer;//指向尾节点(哨兵) protected int size;//队列中元素的数目 //构造函数 public Deque_DLNode() { header = new DLNode(); trailer = new DLNode(); header.setNext(trailer); trailer.setPrev(header); size = 0; } //返回队列中元素数目 public int getSize() { return size; } //判断队列是否为空 public boolean isEmpty() { return (0 == size) ? true : false; } //取首元素(但不删除) public Object first() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); return header.getNext().getElem(); } //取末元素(但不删除) public Object last() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); return trailer.getPrev().getElem(); } //在队列前端插入新节点 public void insertFirst(Object obj) { DLNode second = header.getNext(); DLNode first = new DLNode(obj, header, second); second.setPrev(first); header.setNext(first); size++; } //在队列后端插入新节点 public void insertLast(Object obj) { DLNode second = trailer.getPrev(); DLNode first = new DLNode(obj, second, trailer); second.setNext(first); trailer.setPrev(first); size++; } //删除首节点 public Object removeFirst() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); DLNode first = header.getNext(); DLNode second = first.getNext(); Object obj = first.getElem(); header.setNext(second); second.setPrev(header); size--; return(obj); } //删除末节点 public Object removeLast() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); DLNode first = trailer.getPrev(); DLNode second = first.getPrev(); Object obj = first.getElem(); trailer.setPrev(second); second.setNext(trailer); size--; return(obj); } //遍历 public void Traversal() { DLNode p = header.getNext(); while (p != trailer) { System.out.print(p.getElem()+" "); p = p.getNex

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值