jmud-0.11/
jmud-0.11/bin/
jmud-0.11/doc/
jmud-0.11/rec/
jmud-0.11/rec/mun/
jmud-0.11/rec/mun/grecia/
jmud-0.11/rec/mun/gunnar/
jmud-0.11/rec/qua/
jmud-0.11/src/bool/
jmud-0.11/src/clone/
jmud-0.11/src/integer/
jmud-0.11/src/misc/
jmud-0.11/src/string/
jmud-0.11/src/util/bit/
jmud-0.11/src/util/color/
jmud-0.11/src/util/file/
jmud-0.11/src/util/jgp/adaptor/
jmud-0.11/src/util/jgp/algorithm/
jmud-0.11/src/util/jgp/container/
jmud-0.11/src/util/jgp/functor/
jmud-0.11/src/util/jgp/interfaces/
jmud-0.11/src/util/jgp/predicate/
jmud-0.11/src/util/log/
jmud-0.11/src/util/state/
jmud-0.11/trash/
package util.list;

import java.util.NoSuchElementException;

public class Queue extends List {

  private ListLink tail = null;

  public Queue() {
  }

  private void add(ListLink aLink) {
    if (tail != null)
      tail.setNext(aLink);
    tail = aLink;
    if (head == null)
      head = tail;
  }

  public void insert(Object info) {
    add(new ListLink(info, null));
  }

  ListLink getTail() {
    return tail;
  }

  void setTail(ListLink t) {
    tail = t;
  }

  private ListLink findLastLink() {
    if (head == null)
      return null;

    ListLink curr = head;

    while (curr.getNext() != null)
      curr = curr.getNext();

    return curr;
  }

  public void remove(Object info) throws NoSuchElementException {
    super.remove(info);

    if (head == null)
      tail = null;
    else if (tail.getInfo() == info) 
      tail = findLastLink();
  }

  public Object remove() throws NoSuchElementException {
    if (head == null)
      throw new NoSuchElementException();

    Object info = head.getInfo();
    head = head.getNext();

    if (head == null)
      tail = null;

    return info;
  }

  public Object clone() {

    Queue cloneQueue = new Queue();
    ListEnumeration myElements = elements();

    if (myElements.hasMoreElements()) {

      ListLink prevLink = new ListLink(myElements.nextElement(), null);
      cloneQueue.add(prevLink);

      while (myElements.hasMoreElements()) {
	prevLink.setNext(new ListLink(myElements.nextElement(), null));
	prevLink = prevLink.getNext();
      }

    }

    return cloneQueue;
  }

  public Iterator getIterator() {
    return new QueueIterator(this);
  }
}