// The LinkedList, Link, and ListIterator classes are reformatted
// versions of the programs appearing in Chapter 8 of Tim Budd's
// _Introduction to Object-Oriented Programming_.

class LinkedList 
{   // constructors
        public LinkedList () { firstLink = null; }
    // mutators
        public void add (Object newValue) 
        {       firstLink = new Link(newValue, firstLink); 
        }

        public void pop ()
        {       if (firstLink != null) 
                        firstLink = firstLink.next();
        }

    // accessors
        public Object front ()
        {       if (firstLink == null)
                        return null;
                return firstLink.value();
        }

        public boolean empty () { return (firstLink == null); }

        public ListIterator iterator ()
        {       return new ListIterator (firstLink); 
        }

    // data fields
        private Link firstLink;  // first entry in list
}

class Link 
{   // constructors
        public Link (Object newValue, Link next) 
        {       valueField = newValue; 
                nextLink = next; 
        }

    // accessors
        public Object value ()  { return valueField; }

        public Link next () { return nextLink; }

    // data fields
        private Object valueField;  // data at this entry
        private Link nextLink;      // link to next entry
}

class ListIterator 
{   //constructors
        public ListIterator (Link firstLink) 
        {       currentLink = firstLink; 
        }  

    // mutators
        public void next ()
        {       if (currentLink != null) 
                        currentLink = currentLink.next();
        }

    // accessors
        public Object current ()
        {       if (currentLink == null)
                        return null;
                return currentLink.value(); 
        }

        public boolean atEnd () { return (currentLink == null); }

    // data fields
        private Link currentLink;  // current position in list
}
