Java LinkedList

LinkedList implementation

Let's create a linked list. The following code defines a ListNode class. The ListNode class has a public field called next which is also a ListNode. We use the next to reference the next list node.


class ListNode {//from w  w w  .  j av  a2  s .com
  public ListNode(Object theElement) {
    this(theElement, null);
  }

  public ListNode(Object theElement, ListNode n) {
    element = theElement;
    next = n;
  }

  public Object element;

  public ListNode next;
}

LinkedListIterator gets the next list node in the list.


class LinkedListIterator {
  LinkedListIterator(ListNode theNode) {
    current = theNode;/* ww  w.  ja  va  2  s . c o  m*/
  }

  public boolean isValid() {
    return current != null;
  }

  public Object retrieve() {
    return isValid() ? current.element : null;
  }

  public void advance() {
    if (isValid())
      current = current.next;
  }

  ListNode current;
}

Put everything together.


public class Main {
  public static void main(String[] args) {
    LinkedList theList = new LinkedList();
    LinkedListIterator theItr;/* w w  w.  ja va2s. co  m*/

    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;
}

The code above generates the following result.

Next chapter...

What you will learn in the next chapter:

  1. Binary Tree implementation
Home »
  Java Tutorial »
    Java Langauge »
      Java Data Structures
Java Growable integer array
Java LinkedList
Java Binary Tree
Java Tree