public class LinkedTwoEndedList implements TwoEndedList {

    private int numberOfNodes =0;
    
    private ListNode first, last = null;
    
    public Object getFirst() {
    
        return first.contents;
    
    }
    
    public Object getLast() {
    
        return last.contents;
        
    }
    
    public Object removeFirst() {
    
        Object o = first.contents;
        first = first.next;
        if(first == null) {
            last = null;
        }
        numberOfNodes--;
        return o;
        
    }
    
    public Object removeLast() {

        Object o = last.contents;
        last = last.previous;
        if(last == null) {
            first = null;
        }
        numberOfNodes--;
        return o;
    
    }
    
    public int size()  {
    
        return numberOfNodes;
    
    }

    public void addFront(Object o) {
    
        ListNode node = new ListNode(o);
        
        if(last == null) {
            last = node;
        } else {
            first.previous = node;
        }
        node.next = first;
        first = node;
        
        numberOfNodes++;
    }
    
    public void addBack(Object o) {
    
        ListNode node = new ListNode(o);
        
        if(first == null) {
            first = node;
        } else {
            last.next = node;
        }
        node.previous = last;
        last = node;
        
        numberOfNodes++;
    }
    
}
