package queue;
public class LinkedListQueue<E> implements Queue<E>{
private Entry<E> header = new Entry<E>(null, null, null);
private Entry<E> tail = new Entry<E>(null, null, null);
private int size = 0;
LinkedListQueue(){
header.next = tail;
tail.previous = header;
}
public boolean isEmpty() {
return header.next == tail;
}
public void enqueue(E item) {
Entry<E> newEntry = new Entry<E>(item, tail, tail.previous);
tail.previous.next = newEntry;
tail.previous = newEntry;
size++;
}
public E dequeue() {
if(isEmpty()){
throw new EmptyQueueException();
}
Entry<E> entry = header.next;
if (entry.next != null) {
entry.next.previous = header;
header.next = entry.next;
}
size--;
return entry.element;
}
public int size() {
return size();
}
private static class Entry<E>{
E element;
Entry<E> next;
Entry<E> previous;
Entry(E element, Entry<E> next, Entry<E> previous){
this.element = element;
this.next = next;
this.previous = previous;
}
}
}