public class LinkedQueue<E> implements Queue<E> {
    private ListNode<E> head = null;	// beginning
    private ListNode<E> tail = null;    // end
    public boolean isEmpty() {  return this.head == null;  }
    public E peek() {  return this.head.getElem();  }
    public E poll() {
        E result = this.peek();
        this.head = this.head.getNext();
        if (this.head == null) {
            this.tail = null;
        }
        return result;
    }
    public boolean offer(E elem) {
        ListNode<E> node = new ListNode<E>(elem, null);
        if (this.head == null) {
            this.head = this.tail = node;
        } else {
            this.tail.setNext(node);
            this.tail = node;
        }
        return true;
    }
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedQueue<Integer>();
        for (int i = 0; i < 100; i++) {
            queue.offer(i*i);
        }
        while (!queue.isEmpty()) {
            System.out.println(queue.poll());
        }
    }
}

