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();
}
}