Here are the methods we wrote today:

//In List:
    abstract public int max();
    //return the maximum value in the list
    
    abstract public List add(int val, int index);
    //add val so it occupies position index
    //returns the new list

//In EmptyList:
    public int max() {
        return Integer.MIN_VALUE;
    }
    
    public List add(int val, int index) {
        List retVal = new NEList(val, new EmptyList());
        return retVal;
    }

//In NEList:
    public int max() {
        int otherMax = next.max();
        if(value > otherMax) {
            return value;
        }
        return otherMax;
    }
    
    public List add(int val, int index) {
        if(index == 0) {  //want to add to beginning
          List retVal = new NEList(val, this);
          return retVal;
        }
        next = next.add(val, index-1);
        return this;
    }