Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tema 3: Listas
Listas 2
INDICE
1. Introducción.
2. El TAD Lista ordinal.
2.1. Implementación con una lista enlazada.
2.2. Iteradores.
2.3. Uso de listas ordinales.
2.4. Implementación con un array dinámico.
2.5. Comparativa de ambas implementaciones.
2.6. Listas ordinales en la Biblioteca estándar de Java.
3. El TAD Lista Calificada o Diccionario.
3.1. Implementación con una lista enlazada.
3.2. Listas calificadas en la Biblioteca estándar de Java.
4. Otras implementaciones.
4.1. Listas doblemente enlazadas.
4.2. Listas enlazadas con cabecera y centinela.
4.3. Listas enlazadas reorganizables.
Listas 3
1. Introducción.
Definición de lista:
Un TAD Lista representa una secuencia homogénea y lineal de
elementos.
Homogénea porque todos los elementos de una lista son del
mismo tipo. Así por ejemplo, se puede tener una lista de enteros,
de cadenas o de objetos Alumno.
Lineal porque existe una relación lineal entre los elementos: cada
elemento tiene un único sucesor y un único predecesor, excepto el
primero y el último.
Listas 4
1. Introducción.
Clasificación de las listas:
Listas ordinales: cada elemento se almacena en la lista en base a
su orden de llegada, no depende del valor del elemento. Las pilas
y las colas son ejemplos de listas ordinales. En este tema se verá un
TAD de lista ordinal más general que las pilas y las colas.
Listas Calificadas o diccionarios: cada elemento de la lista lleva
asociado un campo clave. Por cuestiones de eficiencia, los
elementos se ordenan en base a este campo clave. No puede haber
dos elementos con el mismo campo clave. La idea es que se utilice
el campo clave para buscar la información de un elemento.
Listas 5
1. Introducción.
Implementacion de los TADs listas:
Para implementar los TADs que se propondrán en este tema, se
utilizarán estructuras de datos de diferentes tipos, realizando
además una comparativa de eficiencia:
• Listas enlazadas. Que tienen la ventaja de ser una estructura
dinámica y que, por tanto, hacen un mejor uso de la memoria.
• Arrays. Los arrays estáticos quedan descartados porque no son
adecuados cuando no se sabe el número de elementos que se van a
almacenar en la lista. En cambio, sí se utilizarán arrays dinámicos, que
cambian de tamaño según sea necesario.
Listas 6
numElementos = 4
Objeto
Lista Ordinal fin
inicio
siguiente
dato
null
10 12 13 21
Objeto Objeto Objeto Objeto
Nodo Nodo Nodo Nodo
2.2. Iteradores.
Es posible recorrer una lista ordinal utilizando el método
getElemento de la interfaz, como se muestra en el siguiente ejemplo:
public class Aplicacion {
public static void main(String[] args) {
ListaOrdinal lista = new ListaOrdinal();
for (int i = 0; i < 5; i++) {
lista.insertar(i);
lista.insertar(i * i);
}
System.out.print(lista.getNumElementos() + " elementos: ");
int numElem = lista.getNumElementos();
for (int i = 0; i < numElem; i++) {
System.out.print(lista.getElemento(i) + " ");
}
}
}
10 elementos: 0 0 1 1 2 4 3 9 4 16
Listas > 2. El TAD Lista Ordinal. 19
2.2. Iteradores.
En el ejemplo anterior, cada vez que se llama al método
getElemento(i) comienza desde el nodo inicial de la lista hasta
llegar a la posición i. Así, para recorrer una lista de n elementos
habría que pasar por un total de ∑𝑛𝑛𝑖𝑖=1 𝑖𝑖 nodos de la lista. Por
ejemplo, si la lista tiene 1.000 elementos, habría que pasar por
500.500 nodos.
En consecuencia, podemos afirmar que el recorrido de la lista es
bastante poco eficiente.
El uso de iteradores para hacer recorridos en una lista consigue
soluciones más eficientes.
Además, los iteradores constituyen un patrón de diseño en la
programación, es decir, una solución cuya efectividad ha quedado
probada y que se recomienda utilizar.
Listas > 2. El TAD Lista Ordinal. 20
2.2. Iteradores.
Un objeto iterador “apunta” a un elemento de la lista.
Inicialmente “apunta” al primer elemento, pudiendo ofrecer
dicho elemento y avanzar al siguiente. Este razonamiento se
puede seguir aplicando hasta llegar al final de la lista.
Las operaciones básicas que ofrece un iterador en Java son
dos:
• boolean hasNext() --> devuelve true cuando el elemento
al que “apunta” existe. Por el contrario, devuelve false si la lista
se ha acabado, es decir, cuando el elemento “apuntado” no
existe.
• int next() --> devuelve el elemento “apuntado” por el
iterador, que en nuestra lista ordinal es un entero. Además,
avanza el iterador al siguiente elemento de la lista.
Listas > 2. El TAD Lista Ordinal. 21
2.2. Iteradores.
La forma de recorrer la lista utilizando un iterador es la siguiente:
public class Aplicacion {
public static void main(String[] args) {
ListaOrdinal lista = new ListaOrdinal();
for (int i = 0; i < 5; i++) {
lista.insertar(i);
lista.insertar(i * i);
}
System.out.print(lista.getNumElementos() + " elementos: ");
Iterador it = lista.getIterador();
while (it.hasNext()) {
System.out.print(it.next());
}
}
}
10 elementos: 0 0 1 1 2 4 3 9 4 16
Listas > 2. El TAD Lista Ordinal. 22
2.2. Iteradores.
De esta manera, se realiza el recorrido a la lista de forma más
eficiente, pasando una única vez por cada nodo. Así, para una lista
de 1.000 elementos, se pasaría únicamente por 1.000 nodos.
Implementación de los iteradores:
1. Añadir el método getIterador a la interfaz de la clase
ListaOrdinal. Este método crea y devuelve un objeto Iterador,
que apunta al primer elemento de la lista ordinal:
2.2. Iteradores.
2. Implementación de la clase Iterador:
aux
4 12 3 1 77
La clase LinkedList<E>:
Implementa la abstracción lista ordinal a través de una lista
enlazada. Con la peculiaridad de que esta lista es doblemente
enlazada.
Tiene un parámetro <E>, por lo que se trata de una clase
parametrizada de Java. A través de este parámetro, se puede
determinar el tipo componente de la lista ordinal:
• Si se quiere una lista de enteros:
LinkedList<Integer> lista = new LinkedList<Integer>()
• Si se quiere una lista de objetos de la clase Alumno:
LinkedList<Alumno> lista = new LinkedList<Alumno>()
Listas > 2. El TAD Lista Ordinal. 41
10 elementos: 0 0 1 1 2 4 3 9 4 16
Listas > 2. El TAD Lista Ordinal. 43
10 elementos: 0 0 1 1 2 4 3 9 4 16
Listas 45
Objeto Alumno
Siguiente
numElementos
Alberto Ana Jorge María
null
inicio 21 García 29 Pérez 71 Díaz 91 Gómez
…. …. …. ….
Objeto Objeto Objeto Objeto Objeto
Lista Calificada Nodo Nodo Nodo Nodo
Listas > 3. El TAD Lista Calificada o Diccionario. 49
// Continúa main
Alumno alumno = lista.getElemento(7);
if (alumno != null) {
System.out.println("El alumno con matrícula 7 es:");
alumno.mostrar();
}
for (int i = 0; i < 10; i++) {
lista.borrar(i);
}
System.out.println("\nDespués de borrar las claves < 10 quedan “
+ lista.getNumElementos() + " alumnos");
it = lista.getIterador();
while (it.hasNext()) {
it.next().mostrar();
}
System.out.println("--------------------------------");
} // Final de main
} // Final de clase Aplicacion
Listas > 3. El TAD Lista Calificada o Diccionario. 58
4. Otras implementaciones.
4.1. Listas doblemente enlazadas.
Cada nodo está enlazado con el elemento anterior y con el siguiente. De
manera que la lista puede recorrerse en ambos sentidos.
El elemento anterior al primero es null.
El elemento siguiente al último es null.
Objeto Alumno
Siguiente
Anterior
numElementos
Alberto Ana Jorge María
null
null
null
inicio 21 García 29 Pérez 71 Díaz 91 Gómez
…. …. …. ….
Eva
49 Arias
….
null
inicio 21 García 29 Pérez 71 Díaz 91 Gómez
…. …. …. ….
numElementos
Objeto Lista
Calificada centinela
cabecera
Ana Jorge
null
29 Pérez 71 Díaz
…. ….