// Añade un elemento a la lista (en el lugar de orden que le corresponde)
  public void add(T elem) {
    DoubleNode<T> nuevo = new DoubleNode<T>(elem);
    DoubleNode<T> actual = first;

    while (actual != null && actual.getElement().compareTo(elem) < 0)
    // La lista no es vacía Y no ha encontrado la posición
    {
      actual = actual.getNext();
    }
    if (actual == null) { // la lista es vacía o se inserta al final
      if (first != null) { // insertar al final
        last.setNext(nuevo);
        nuevo.setPrevious(last);
        last = nuevo;
      } else { // la lista es vacía
        last = nuevo;
        first = nuevo;
      }
    } else if (actual == first) { // inserción al principio
      nuevo.setNext(first);
      first.setPrevious(nuevo);
      first = nuevo;
    } else {
      nuevo.setNext(actual);
      nuevo.setPrevious(actual.getPrevious());
      actual.setPrevious(nuevo);
      nuevo.getPrevious().setNext(nuevo);
    }
    length++;
  }
  @Override
  public void add(T element) {
    Comparable temp = (Comparable) element;

    DoubleNode e = new DoubleNode(element);
    DoubleNode tt;

    boolean found = false;
    // se vazia
    if (isEmpty()) {
      super.setRear(e);
      super.setFront(e);

    } else {
      tt = super.getFront();

      while (tt != null && !found) {
        if (temp.compareTo(tt.getElement()) > 0) {
          tt = tt.getNext();
        } else {
          found = true;
        }
      }
      // adicionar a cauda
      if (tt == null) {

        super.getRear().setNext(e);
        e.setPrevious(super.getRear());
        super.setRear(e);
        // adicionar a front
      } else if (tt.equals(super.getFront())) {

        e.setNext(super.getFront());
        super.getFront().setPrevious(e);
        super.setFront(e);

      } else {
        // adicionar ao meio
        e.setPrevious(tt.getPrevious());
        e.setNext(tt);
        tt.setPrevious(e);
        e.getPrevious().setNext(e);
      }
    }
    super.setCount(super.getCount() + 1);
  }