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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值