Linked List class

 
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;
}
  
Home 
  Java Book 
    Runnable examples  

Algorithm:
  1. Binary search
  2. Binary Search Insert
  3. Recursive Binary Search Implementation in Java
  4. Linear Searching double Arrays
  5. Bubble sort
  6. Heap sort
  7. Merge sort
  8. Fast Merge Sort
  9. Fast Quick Sort
  10. Simple version of quick sort
  11. Quicksort for sorting arrays
  12. Quick Sort Implementation with median-of-three partitioning and cutoff for small arrays
  13. Quick sort with median-of-three partitioning
  14. Insert sort
  15. Insert Sort for objects
  16. Selection sort
  17. Shell sort
  18. Fibonacci
  19. Hanoi puzzle
  20. Table of fahrenheit and celsius temperatures
  21. Growable integer array
  22. Linked List class
  23. Binary Tree
  24. Tree with generic user object