java数据结构之LinkedDeque(用链表实现的双端(即头尾两个哨兵节点)双向(node里两个指向)队列)

 

package com.jimmy.impl;

import com.jimmy.QueueInterf;

public class LinkedDeque<T> implements QueueInterf<T> {

/**

*

* @param args

*/

public class Node {

private T data;

//双向

public Node next;

public Node pre;

public Node(T data, Node node) {

this.data = data;

next = node;

}

public Node(Node last, T data, Node first) {

this.data = data;

 

this.pre = last;

this.next = first;

}

public T getData() {

return data;

}

}

//双端

public Node first;// 前(端)哨兵节点,这里不同与MylinkedList的做法,并没有初始化first,last对象,仅仅把它当做引用,但仍然可以理解为哨兵

public Node last;// 后(端)哨兵节点

public int length;// 有效数据长度

// |----| |-----| |----|

// | first|--> | 4 | | 5 | | 3 | <--|last| length=3

// |----| |-----| |----|

public LinkedDeque() {

first = null;// 这里不同与MylinkedList的做法,并没有初始化first,last对象

last = null;

}

public static void main(String[] args) {

LinkedDeque<Integer> q = new LinkedDeque<Integer>();

q.addBack(4);

q.addBack(5);

q.addBack(3);

q.display();

q.removeFront();

q.removeFront();

q.display();

}

// 相当于入队(从后面)

public void addBack(T newEntry) {

Node newNode = new Node(last, newEntry, null);  //把newEntry放到last后面,即:

//newEntry.pre = last;

//newEntry.next = first;(null)

if (isEmpty())

{

first = newNode;// 仅仅把fist当做引用,所以直接赋值给first,即把newnode当做第一个first

last = newNode;

} else {

last.next = newNode;

last = newNode;

}

length++;

}

public void addFront(T newEntry) {

Node newNode = new Node(null, newEntry, first);//把newEntry放到first前面,即:

//newEntry.pre = last;(null)

//newEntry.next = first;

if (isEmpty())

{

last = newNode;// 仅仅把fist当做引用,所以直接赋值给first,即把newnode当做第一个first

} else {

first.pre = newNode;

first = newNode;

}

length++;

}

public void enqueue(T newEntry) {

Node newNode = new Node(newEntry, null);

if (isEmpty())

{

first = newNode;// 仅仅把fist当做引用,所以直接赋值给first,即把newnode当做第一个first

last = newNode;

// |----|

// | first|--> | 4 | <--|last|

// |----|

} else {

last.next = newNode;// 有点像C的做法

last = newNode;

}

length++;

}

//相当于出对

public T removeFront() {

T front = null;

if (!isEmpty())

{

front = first.getData();

first = first.next;

if (first == null)

last = null;

else

first.pre = null;

}

length--;

return front;

}

public T removeBack() {

T front = null;

if (!isEmpty())

{

front = first.getData();

first = first.next;

if (first == null)

last = null;

else

first.pre = null;

}

length--;

return front;

}

public T dequeue() {

T front = null;

if (!isEmpty())

{

front = first.getData();

first = first.next;

}

length--;

return front;

}

public T getFront() {

T front = null;

if (!isEmpty())

{

front = first.getData();

}

return front;

}

public boolean isEmpty() {

return first == null;

}

public void clear() {

first = null;

last = null;

}

public int getLength()

{

return length;

}

public void display() {

Node cur = first;// first为哨兵

while (cur != null) {// 从一开始

// if(cur!=null)

System.out.print(cur.getData() + ",");

cur = cur.next;

}

System.out.println();

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值