public void remove(Object inputData) {
    ListNode currentNode = (ListNode) this.firstNode;

    if (this.size == 0) {
      return;
    }

    boolean wasDeleted = false;

    /* Are we deleting the first node? */
    if (inputData.equals(currentNode.getData())) {

      /* Only one node in list, be careful! */
      if (currentNode.getNext() == null) {
        ((ListNode) this.firstNode).setData(null);
        this.firstNode = new ListNode();
        this.lastNode = (ListNode) this.firstNode;
        this.size--;
        return;
      }

      currentNode.setData(null);
      currentNode = currentNode.getNext();
      this.firstNode = currentNode;
      this.size--;
      return;
    }

    while (true) {
      /* If end of list, stop */
      if (currentNode == null) {
        wasDeleted = false;
        break;
      }

      /* Check if the data of the next is what we're looking for */
      ListNode nextNode = currentNode.getNext();
      if (nextNode != null) {
        if (inputData.equals(nextNode.getData())) {

          /* Found the right one, loop around the node */
          ListNode nextNextNode = nextNode.getNext();
          currentNode.setNext(nextNextNode);

          nextNode = null;
          wasDeleted = true;
          break;
        }
      }

      currentNode = currentNode.getNext();
    }

    if (wasDeleted) {
      this.size--;
    }
  }
 public static void printList(ListNode head) {
   ListNode current = head;
   while (current != null) {
     System.out.printf("[%d]", current.getData());
     current = current.getNext();
   }
   System.out.println("");
 }
  public void add(Object inputData) {
    ListNode node = new ListNode(inputData);

    /* Make sure we cater for the case where the list is empty */
    if (firstNode.getData() == null) {
      this.firstNode = node;
      this.lastNode = node;
    } else {
      this.lastNode.setNext(node);
      this.lastNode = node;
    }

    this.size++;
  }
  public Object elementAt(int inputPosition) {

    if (inputPosition >= this.size || inputPosition < 0) {
      return null;
    }

    ListNode currentNode = (ListNode) this.firstNode;

    for (int position = 0; position < inputPosition; position++) {
      currentNode = currentNode.getNext();
    }

    return currentNode.getData();
  }
  public String toString() {
    ListNode currentNode = (ListNode) this.firstNode;
    StringBuffer buffer = new StringBuffer();

    buffer.append("{");
    for (int i = 0; currentNode != null; i++) {
      if (i > 0) {
        buffer.append(",");
      }
      Object dataObject = currentNode.getData();

      buffer.append(dataObject == null ? "" : dataObject);
      currentNode = currentNode.getNext();
    }
    buffer.append("}");
    return buffer.toString();
  }
  public int indexOf(Object inputData) {
    ListNode currentNode = (ListNode) this.firstNode;
    int position = 0;
    boolean found = false;

    for (; ; position++) {
      if (currentNode == null) {
        break;
      }

      if (inputData.equals(currentNode.getData())) {
        found = true;
        break;
      }

      currentNode = currentNode.getNext();
    }

    if (!found) {
      position = -1;
    }

    return position;
  }