public void clear() {

    reset();
    list.clear();

    size = 0;
  }
  public boolean addRow(Row row) {

    list.add(row);

    size++;

    return true;
  }
  public void remove() {

    // avoid consecutive removes without next()
    if (previous == null) {
      throw new NoSuchElementException();
    }

    if (currentPos < size && currentPos != -1) {
      list.removeAfter(previous);

      current = previous;

      size--;
      currentPos--;

      return;
    }

    throw new NoSuchElementException();
  }
  public RowSetNavigatorLinkedList() {

    list = new HsqlLinkedList();
    root = list.getHeadNode();
    current = root;
  }
  /** Runs a test on the hsqldb lists */
  public void testLists() {

    HsqlArrayList arrayList = new HsqlArrayList();
    HsqlLinkedList linkedList = new HsqlLinkedList();
    Vector vector = new Vector();
    Vector listCommandsCalled = new Vector(NUMBER_OF_ITERATIONS_PER_RUN);
    Integer tempInt = null;
    int tempCommandCode;
    int tempPosition;
    boolean arrayListException = false;
    boolean linkedListException = false;
    boolean vectorException = false;
    Object arrayListObject = null;
    Object linkedListObject = null;
    Object vectorObject = null;

    for (int i = 0; i < getRandomInt(3, 12); i++) { // prime the contents with a couple items
      tempInt = getRandomInteger();

      arrayList.add(tempInt);
      linkedList.add(tempInt);
      vector.addElement(tempInt);
      listCommandsCalled.addElement("Add");
    }

    compareLists(arrayList, linkedList, vector);

    for (int j = 0; j < NUMBER_OF_ITERATIONS_PER_RUN; j++) {
      tempCommandCode = getRandomInt(0, 15); // 0 and 8 are ignored or used for a special op

      switch (tempCommandCode) {
        case ADD:
          tempInt = getRandomInteger();

          listCommandsCalled.addElement("Add");
          arrayList.add(tempInt);
          linkedList.add(tempInt);
          vector.addElement(tempInt);
          break;

        case ADD_AT:
          tempInt = getRandomInteger();
          tempPosition = getRandomInt(0, vector.size());

          listCommandsCalled.addElement("Add at " + tempPosition);

          try {
            arrayList.add(tempPosition, tempInt);
          } catch (Exception ex) {
            arrayListException = true;
          }

          try {
            linkedList.add(tempPosition, tempInt);
          } catch (Exception ex) {
            linkedListException = true;
          }

          try {
            vector.insertElementAt(tempInt, tempPosition);
          } catch (Exception ex) {
            vectorException = true;
          }
          break;

        case GET:
          tempPosition = getRandomInt(0, vector.size() - 1);

          listCommandsCalled.addElement("Get " + tempPosition);

          try {
            arrayListObject = arrayList.get(tempPosition);
          } catch (Exception ex) {
            arrayListException = true;
          }

          try {
            linkedListObject = linkedList.get(tempPosition);
          } catch (Exception ex) {
            linkedListException = true;
          }

          try {
            vectorObject = vector.elementAt(tempPosition);
          } catch (Exception ex) {
            vectorException = true;
          }
          break;

        case REMOVE:
          tempPosition = getRandomInt(0, vector.size() - 1);

          listCommandsCalled.addElement("Remove " + tempPosition);

          try {
            arrayListObject = arrayList.remove(tempPosition);
          } catch (Exception ex) {
            arrayListException = true;
          }

          try {
            linkedListObject = linkedList.remove(tempPosition);
          } catch (Exception ex) {
            linkedListException = true;
          }

          try {
            vectorObject = vector.elementAt(tempPosition);

            vector.removeElementAt(tempPosition);
          } catch (Exception ex) {
            vectorException = true;
          }
          break;

        case SET:
          tempInt = getRandomInteger();
          tempPosition = getRandomInt(0, vector.size() - 1);

          listCommandsCalled.addElement("Set " + tempPosition);

          try {
            arrayList.set(tempPosition, tempInt);
          } catch (Exception ex) {
            arrayListException = true;
          }

          try {
            linkedList.set(tempPosition, tempInt);
          } catch (Exception ex) {
            linkedListException = true;
          }

          try {
            vector.setElementAt(tempInt, tempPosition);
          } catch (Exception ex) {
            vectorException = true;
          }
          break;

        case OPTIMIZE:
          listCommandsCalled.addElement("Optimize");
          arrayList.trim();
          vector.trimToSize();
          break;

        case REMOVE_ALL:
          if (getRandomInt(0, 5) == 4) { // to limit the frequency of this call
            listCommandsCalled.addElement("Remove all");

            if (vector.size() == 0) {
              break;
            }

            for (int k = arrayList.size() - 1; k >= 0; k--) {
              arrayList.remove(k);
              linkedList.remove(k);
            }

            vector.removeAllElements();
          }
          break;

        default:
      }

      if (arrayListException || linkedListException || vectorException) {

        // if an exception is thrown in vector but not one of the lists or vice versa
        if (!(arrayListException && linkedListException && vectorException)) {
          if (!(arrayListException && vectorException)) {
            System.out.println("Exception descrepancy with vector and arraylist");
          } else if (!(linkedListException && vectorException)) {
            System.out.println("Exception descrepancy with vector and linkedlist");
          } else {
            System.out.println("Error in TestDataStructures");
          }

          this.printListCommandsCalled(listCommandsCalled);
          fail("test failed");

          // System.exit(0);
        }

        return;
      }

      if (!objectEquals(linkedListObject, arrayListObject, vectorObject)) {
        System.out.println("Objects returned inconsistent");
        this.printListCommandsCalled(listCommandsCalled);
        fail("test failed");

        // System.exit(0);
      }

      compareLists(arrayList, linkedList, vector);
    }
  }