public class Queue<T>
{
    /**
     * erster Eintrag der Liste
     */
    public Node<T> first;
    
    /**
     * letzter Eintrag der Liste
     */
    public Node<T> last;
    
    /**
     * Konstruktor
     */
    public Queue() {}
    
    /**
     * Überprüft, ob die Liste leer ist
     * 
     * @return true, wenn keine Elemente in der Liste
     */
    public boolean isEmpty() {
        return first == null;
    }
    
    /**
     * Fügt ein neues Element am Ende der Liste ein
     */
    public void enqueue(T neu) {
        Node n = new Node<T>(neu); // Neue Node mit Wert "neu" anlegen
        
        // Überprüfe, ob Liste leer
        if (first == null) {
            // setze neue Node als ersten Eintrag
            first = n;
            last = n;
        } else {
            last.next = n;
            last = n;
        }
    }
        
    /**
     * Löscht das Element an der ersten Stelle und gibt
     * dessen Wert zurück
     */
    public T dequeue() {
        if (first == null) return null;
        
        T wert = first.wert;
        
        first = first.next;
        
        return wert;
    }
    
    /**
     * Gibt das Element an der ersten Stelle zurück, oder null
     */
    public T front() {
        if (first == null) return null;
        return first.wert;
    }
}