@Override
  public void add(String str)
  {
    skipListNode s = head;
    skipListNode[] newSkip = new skipListNode[maxLevel + 1];

    for (int i = level; i >= 0; i--)
      {
        while (s.next[i] != null && s.next[i].data.compareTo(str) < 0)
          {
            s = s.next[i];
            // if the str is not found, then go to the next one (if exists)
          } // while
        newSkip[i] = s;
      } // for(i)
    s = s.next[0];

    if (s == null || s.data.equals(str))
      {
        int lvl = this.randomLevel();
        // use randomLevel to assign level for this node

        if (lvl > level)
          {
            for (int i = level + 1; i <= lvl; i++)
              {
                newSkip[i] = head;
              } // for(i)
            level = lvl;
          } // if

        s = new skipListNode(str, lvl); // a new node
        for (int c = 0; c <= lvl; c++)
          {
            s.next[c] = newSkip[c].next[c];
            newSkip[c].next[c] = s;
          } // for(c)
      } // if
  }// add(String)