package components.queue;
import java.util.Iterator;
import java.util.NoSuchElementException;
/**
* {@code Queue} represented as a singly linked list, done "bare-handed", with
* implementations of primary methods.
*
*
* Execution-time performance of all methods implemented in this class is O(1).
*
* @param
* type of {@code Queue} entries
* @convention
* $this.length >= 0 and
* [$this.preFront is not null] and
* [$this.rear is not null] and
* [$this.preFront points to the first node of a singly linked list
* containing $this.length + 1 nodes] and
* [$this.rear points to the last node in that singly linked list] and
* [$this.rear.next is null]
*
* @correspondence
* this = [data in nodes starting at $this.preFront.next and
* running through $this.rear]
*
*/
public class Queue2 extends QueueSecondary {
/*
* Private members --------------------------------------------------------
*/
/**
* Node class for singly linked list nodes.
*/
private final class Node {
/**
* Data in node.
*/
private T data;
/**
* Next node in singly linked list, or null.
*/
private Node next;
}
/**
* "Smart node" before front node of singly linked list.
*/
private Node preFront;
/**
* Rear node of singly linked list.
*/
private Node rear;
/**
* One less than number of nodes in singly linked list, i.e., length =
* |this|.
*/
private int length;
/**
* Creator of initial representation.
*/
private void createNewRep() {
this.preFront = new Node();
this.preFront.next = null;
this.rear = this.preFront;
this.length = 0;
}
/*
* Constructors -----------------------------------------------------------
*/
/**
* Np-argument constructor.
*/
public Queue2() {
this.createNewRep();
}
/*
* Standard methods removed to reduce clutter...
*/
/*
* Kernel methods ---------------------------------------------------------
*/
@Override
public final void enqueue(T x) {
assert x != null : "Violation of: x is not null";
Node p = new Node();
Node q = this.rear;
p.data = x;
p.next = null;
q.next = p;
this.rear = p;
this.length++;
}
@Override
public final T dequeue() {
assert this.length() > 0 : "Violation of: this /= <>";
Node p = this.preFront;
Node q = p.next;
T result = q.data;
this.preFront = q;
this.length--;
return result;
}
@Override
public final int length() {
return this.length;
}
/*
* Iterator code removed to reduce clutter...
*/
/*
* Other methods (overridden for performance reasons) ---------------------
*/
@Override
public final T front() {
assert this.length() > 0 : "Violation of: this /= <>";
return this.preFront.next.data;
}
@Override
public final T replaceFront(T x) {
assert this.length() > 0 : "Violation of: this /= <>";
T front = this.preFront.next.data;
this.preFront.next.data = x;
return front;
}
}