Programación IIListas
Igor Santos Grueiro
Ya conocemos las
listas
Listas de amigos
Listas de compras
¿Qué es una lista?
Una lista es un conjunto de elementos homogéneo que cumple:
El orden relativo de estos elementos es significativo
(1,2,3) (1,3,2)!=
Pueden haber elementos repetidos
(1,2,2,2,2,2,2,3)
Ya sabemos utilizar la
lista enlazada
Pero, ¿cómo se implementa por dentro?
Una lista se puede construir:
De forma estática De forma dinámica
Una lista se puede implementar de forma estática mediante un array
Tiene una única ventaja:permite el acceso directo a un
elemento
Tiene múltiples desventajas
El tamaño de la lista tiene que ser fijo y conocido en
tiempo de compilación 1
En las inserciones y borrados, hay que provocar un
desplazamiento de elementos que repercute en el tiempo de
ejecución2
Se desaprovecha el espacio de la memoria real, en el caso de lista
cortas3
ArrayList en java
Para una lista dinámica, de nuevo
Object elementoNodo siguiente
Nodo
public class NodoListaEnlazadaSimple {
private Object elemento;private NodoListaEnlazadaSimple siguiente;
}
}
Tiene los siguientes atributos
}
Un nodo se puede crear de varias formas
Se puede crear vacío1
public NodoListaEnlazadaSimple(){this.elemento = null;this.siguiente = null;
}
null
Se puede crear con un objeto dentro2
public NodoListaEnlazadaSimple(Object x) {this.elemento = x;this.siguiente = null;
}
x
Se puede crear con un objeto dentro y un enlace a
otro nodo3public NodoListaEnlazadaSimple(Object x,
NodoListaEnlazadaSimple sig) {this.elemento = x;
this.siguiente = sig;}
XNodo siguiente
}
Getters y Setters para el valor del objeto y para el nodo siguiente
}
Podemos insertar un nodo siguiente
al nodo
public void insertarSig(Object x){NodoListaEnlazadaSimple nuevoNodo = new
NodoListaEnlazadaSimple();nuevoNodo.elemento = x;nuevoNodo.siguiente = this.siguiente;this.siguiente = nuevoNodo;
}
elementosiguiente
X
}
Podemos borrar el siguiente nodo
public void borrarSig(){this.siguiente = this.siguiente.siguiente;
}
Ahora la clase
ListaEnlazadaSimple
public class ListaEnlazadaSimple {
private NodoListaEnlazadaSimple primero;
private NodoListaEnlazadaSimple recorrido;
private int tamanyo;
public ListaEnlazadaSimple(){this.primero = null;this.recorrido = null;this.tamanyo = 0;
}}
}
//…public void vaciar(){
this.primero = null;this.recorrido = null;this.tamanyo = 0;
}//…
Para vaciar el primer nodo y el recorrido a null
//…public boolean estaVacia (){
return (this.primero == null);}//…
Para comprobar si una lista está vacía comprobamos si
el primero es null
//…public int tamanyo(){
return tamanyo;}//…
También, podemos recuperar el número de elementos
insertados en la lista
public Object cima(){ return v[cont-1]; }
//…public void insertarPrimero(Object x) {
primero = new NodoListaEnlazadaSimple(x, primero);
this.tamanyo++;}//…
Podemos insertar un objeto en la primera posición de la lista
public Object cima(){ return v[cont-1]; }
Primero Cima
x
//…private NodoListaEnlazadaSimple
devuelvePos(int pos) {NodoListaEnlazadaSimple temp =
primero;for (int i = 1; i <= pos; i++) {
temp = temp.getSiguiente();}return temp;
}//…
Necesitaremos acceder al nodo en cierta posición de la lista
public Object cima(){ return v[cont-1]; }
//…public void insertarPos(Object x, int pos) {
if (pos == 0)primero = new NodoListaEnlazadaSimple(x, primero);
elsedevuelvePos(pos - 1).insertarSig(x);
tamanyo++;}//…
Para insertar un objeto en cierta posición de la lista
public Object cima(){ return v[cont-1]; }
elementosiguiente
X
Primero Cima Pos 1
//…public void modificarPos(Object x, int pos) {
NodoListaEnlazadaSimple temp = devuelvePos(pos);
temp.setElemento(x);}//…
Para modificar un objeto en cierta posición de la lista
public Object cima(){ return v[cont-1]; }
//…public void borrarPos(int pos) {
if (pos == 0)primero = primero.getSiguiente();
else {NodoListaEnlazadaSimple temp =
devuelvePos(pos - 1);temp.borrarSig();
}tamanyo--;
}//…
Para borrar un objeto en cierta posición de la lista
public Object cima(){ return v[cont-1]; }
Primero Cima Pos 1
//…public void borrar(Object x) {
NodoListaEnlazadaSimple ant = null;NodoListaEnlazadaSimple temp = primero;while ((temp != null) && (!temp.getElemento().equals(x))) {
ant = temp;temp = temp.getSiguiente();
}if (temp != null) {
if (temp == primero)primero = temp.getSiguiente();
elseant.setSiguiente(temp.getSiguiente());
tamanyo--;}
}//…
Para borrar un objeto específico de la lista
public Object cima(){ return v[cont-1]; }
//…public Object extraerPos(int pos) {
return devuelvePos(pos).getElemento();}//…
Podemos devolver un elemento en cierta posición
public Object cima(){ return v[cont-1]; }
//…public int buscar(Object x) {
int i = 0;NodoListaEnlazadaSimple temp = primero;while ((i < tamanyo) && (!temp.getElemento().equals(x))) {
temp = temp.getSiguiente();i++;
}if (i >= tamanyo)
return -1;else
return i;}//…
Para buscar un objeto específico de la lista
public Object cima(){ return v[cont-1]; }
Las operaciones de recorrido
//…public void inicioRecorrido() {
recorrido = primero;}//…
Podemos iniciar un recorrido por la lista
public Object cima(){ return v[cont-1]; }
//…public Object getElemento() {
Object x = recorrido.getElemento();recorrido = recorrido.getSiguiente();return x;
}//…
Podemos seguir avanzando por la lista
public Object cima(){ return v[cont-1]; }
//…public boolean finRecorrido() {
return (recorrido == null);}//…
Podemos saber si hemos acabado el recorrido
public Object cima(){ return v[cont-1]; }
Ésta es la lista
simplemente enlazada
Cada nodo tiene 1 enlace
Pero hay más listas …
Cada nodo tiene 2 enlaces
Listas doblemente enlazadas
Optimizan la inserción por el medio de la lista
Podemos mejorar la inserción al final añadiendo una referencia al
nodo final
Lista con inserción por el final
Primero Último
Y aún hay más
Listas circularesPueden ser simplemente o doblemente enlazadas
Ejercicio
Realizar listas:Simplemente enlazadaSimplemente enlazada con inserción al final
: