2. TDA
Listas Doblemente Enlazadas
En las listas enlazadas solo se avanza en un sentido
En las dobles, se puede avanzar hacia la derecha o hacia la izq.
En estas listas cada nodo tiene
Un predecesor, excepto el primero
Un sucesor, excepto el último
Cada nodo ya no tiene un solo enlace, tiene dos, hacia el siguiente y hacia el
anterior
5. Listas Doblemente Enlazadas
Rendimiento de operaciones
¿Cuánto tiempo toma acceder a un elemento en la implementación de
LinkedList (en el peor caso)?
– El peor de los casos
• Acceder al elemento medio de la lista
• Moverse por a través de O(n/2) referencias desde la cabecera (o desde la cola) de la lista hasta
el elemento que nos interesa
• O(n)
6. Listas Doblemente Enlazadas
Rendimiento de operaciones
¿Cuánto tiempo toma insertar al inicio un elemento en la implementación de
LinkedList?
Insertar un elemento en la cabecera de una lista enlazada significa
asignar las referencias de manera que el primero elemento pase a ser el
segundo elemento
El número de operaciones es constante y no depende de cuantos
elementos existen en la lista
O(1)
7. 10 5 21 12 17 6
Listas Doblemente Enlazadas
Insertar nodos (inicio o al final)
lastheader
nuevo.next = header
header. previous= nuevoheader
header = nuevo
nuevo
15
nuevo.previous = last
last.next = nuevo
last
last = nuevo
nuevo
15
header
8. Listas Doblemente Enlazadas
Insertar entre
header last
10 5 21 12 17 6
p
nuevo
15
nuevo.next = p.next;
p.next = nuevo
nuevo.previous = p
nuevo.next.previous = nuevo
11. Listas Circulares
• El avance en las listas enlazadas es
– Solo a la derecha(siguiente)
– Limitado hasta el último nodo
• Hay ocasiones en las que se desearía,
– Poder avanzar ilimitadamente
– Del último nodo, pasar al primero
• last.next = first
10 5 8 2 3125
last.next last
12. El TDA Listas Circulares
No es necesario mantener un control de:
– Primero y último
– Solo con el último ya se tiene todo, pues el siguiente al último es el
primero
10 5 8 2 3125
last.next last
13. private static class Node<E> {
private E element;
private Node<E> next;
public Node(E e, Node<E> n) {
element = e;
next = n;
}
public E getElement( ) { return element; }
public Node<E> getNext( ) { return next; }
public void setNext(Node<E> n) { next = n; }
}
Crear nodo
Para crear un nodo válido (como clase privada de la Lista)
19. Listas circulares doblemente enlazadas (LCDE)
• Es una implementación de listas circulares
– Con nodos que tienen dos punteros
• Así se recorre la lista en el
– Sentido del avance del reloj y
– En sentido contrario
• Seguimos llevando un control solo del último nodo de la lista
10 5 8 25 2 31
last
20. Recorrer lista
Escribir una operación RecorrerR que recorre una lista Circular
Doblemente Enlazada hacia atrás
void RecorreR(){
LCDENodo pos;
if(this.isEmpty())
return;
pos = this.last;
recorrer = true;
while(recorrer ){
System.out.println(pos.e)
pos = pos.prev;
if(pos == this.last)
recorrer = false;
}
}
10 5 8 25 2 31
last
23. ArrayList:
lista implementada con un Array
• Acceso posicional eficiente
• Inserción y extracción costosas menos en la última posición
que es instantánea
• Cuando se supera el tamaño del array, se crea uno nuevo
más grande y se copian en él los elementos del antiguo
10
0
5
1
8
2
2
3
31
4 5 6 7 8
En uso Desperdicio
25
3
2
4 5 6 7 8
size Capacidad
ensureCapacity
24. LinkedList:
lista doblemente enlazada
• Acceso posicional costoso
• Inserción y extracción costosas, menos en la primera y
última posición que es inmediato
• Tamaño ilimitado
lastfirst
10 5 8 25 2 31
26. LinkedList:
métodos principales
add(índice, objeto) Añade un objeto en el índice.
remove(índice) Elimina el elemento que se encuentra en el índice.
set (índice, objeto) cambia el objeto en la posición del índice.
get(índice) Recupera el elemento que se encuentra en el índice.
contains(objeto) Se usa para saber si la lista contiene un objeto
determinado.
indexOf(objeto) Se usa para saber el índice de un objeto determinado.
isEmpty() devuelve true si la lista esta vacía y false si no lo está.
size() devuelve el tamaño de la lista
clear() borra todos los elementos de la lista
27. LinkedList:
métodos principales
addAll(índice, Colección) Añade una colección en el índice.
removeAll(Colección) Elimina todos los elementos que coinciden
con otra colección .
retainAll(Colección) Mantiene los elementos de la lista presentes
en otra colección.
containsAll(Colección) Se usa para saber si la lista contiene todos los
elementos de otra colección .
28. Implementar TDA Lista Circular
• Consultar primero, último y tamaño
– E first();
– E last();
– int size();
• Conocer Estado
– bool isEmpty();
• Añadir y Remover
– void addFirst(E e);
– void addLast(E e);
– bool add(int i, E e);
– E removeFirst();
– E removeLast();
• Búsqueda
– int indexOf(E e);
– bool contains (E e);