Collections Data Structure Java

public class Main {
  public static void main(String[] args) {
    LinkedList theList = new LinkedList();
    LinkedListIterator theItr;
    theItr = theList.zeroth();
    printList(theList);
    for (int i = 0; i < 10; i++) {
      theList.insert(new Integer(i), theItr);
      printList(theList);
      theItr.advance();
    }
    System.out.println("Size was: " + listSize(theList));
   }
  public static int listSize(LinkedList theList) {
    LinkedListIterator itr;
    int size = 0;
    for (itr = theList.first(); itr.isValid(); itr.advance())
      size++;
    return size;
  }
  public static void printList(LinkedList theList) {
    if (theList.isEmpty())
      System.out.print("Empty list");
    else {
      LinkedListIterator itr = theList.first();
      for (; itr.isValid(); itr.advance())
        System.out.print(itr.retrieve() + " ");
    }
    System.out.println();
  }
}
class LinkedList {
  public LinkedList() {
    header = new ListNode(null);
  }
  public boolean isEmpty() {
    return header.next == null;
  }
  public void makeEmpty() {
    header.next = null;
  }
  public LinkedListIterator zeroth() {
    return new LinkedListIterator(header);
  }
  public LinkedListIterator first() {
    return new LinkedListIterator(header.next);
  }
  public void insert(Object x, LinkedListIterator p) {
    if (p != null && p.current != null)
      p.current.next = new ListNode(x, p.current.next);
  }
  public LinkedListIterator find(Object x) {
    ListNode itr = header.next;
    while (itr != null && !itr.element.equals(x))
      itr = itr.next;
    return new LinkedListIterator(itr);
  }
  public LinkedListIterator findPrevious(Object x) {
    ListNode itr = header;
    while (itr.next != null && !itr.next.element.equals(x))
      itr = itr.next;
    return new LinkedListIterator(itr);
  }
  public void remove(Object x) {
    LinkedListIterator p = findPrevious(x);
    if (p.current.next != null)
      p.current.next = p.current.next.next; // Bypass deleted node
  }
  private ListNode header;
}
class LinkedListIterator {
  LinkedListIterator(ListNode theNode) {
    current = theNode;
  }
  public boolean isValid() {
    return current != null;
  }
  public Object retrieve() {
    return isValid() ? current.element : null;
  }
  public void advance() {
    if (isValid())
      current = current.next;
  }
  ListNode current;
}
class ListNode {
  public ListNode(Object theElement) {
    this(theElement, null);
  }
  public ListNode(Object theElement, ListNode n) {
    element = theElement;
    next = n;
  }
  public Object element;
  public ListNode next;
}