Académique Documents
Professionnel Documents
Culture Documents
Pgina 1 de 13
LISTAS ENLAZADAS
Pgina 2 de 13
espacio cuando aade tems a un array, debe crear un array ms grande, copiar los datos del array
original el nuevo array mayor y eliminar el original. Esto cuesta tiempo, lo que afecta especialmente al
rendimiento si se hace repetidamente.
Mezclando una lista de enlace simple con un array uni-dimensional para acceder a los nodos
mediante los ndices del array no se consigue nada. Gastar ms memoria, porque necesitar los
elementos del array ms los nodos, y tiempo, porque necesitar mover los tems del array siempre que
inserte o borre un nodo. Sin embargo, si es posible integrar el array con una lista enlazada para crear
una estructura de datos til.
Existen diferentes tipos de listas enlazadas: Lista Enlazadas Simples, Listas Doblemente Enlazadas
y Listas Enlazadas Circulares.
Las listas enlazadas pueden ser implementadas en muchos lenguajes. Lenguajes tales como Lisp
y Scheme tiene estructuras de datos ya construidas, junto con operaciones para acceder a las listas
enlazadas. Lenguajes imperativos u orientados a objetos tales como C, C++ o Java disponen de
referencias para crear listas enlazadas.
Las operaciones que podemos realizar sobre una lista enlazada son las siguientes:
Recorrido. Esta operacin consiste en visitar cada uno de los nodos que forman la lista. Para
recorrer todos los nodos de la lista, se comienza con el primero, se toma el valor del campo liga para
avanzar al segundo nodo, el campo liga de este nodo nos dar la direccin del tercer nodo, y as
sucesivamente.
Insercin. Esta operacin consiste en agregar un nuevo nodo a la lista. Para esta operacin se
pueden considerar tres casos:
Insertar un nodo al inicio.
Insertar un nodo antes o despus de cierto nodo.
Insertar un nodo al final.
Borrado. La operacin de borrado consiste en quitar un nodo de la lista, redefiniendo las ligas que
correspondan. Se pueden presentar cuatro casos:
Eliminar el primer nodo.
Eliminar el ltimo nodo.
Eliminar un nodo con cierta informacin.
Eliminar el nodo anterior o posterior al nodo cierta con informacin.
Bsqueda. Esta operacin consiste en visitar cada uno de los nodos, tomando al campo liga como
puntero al siguiente nodo a visitar.
Pgina 3 de 13
Pgina 4 de 13
quedarse con una referencia solamente al ltimo elemento en una lista enlazada circular simple, esto
nos permite rpidas inserciones al principio, y tambin permite accesos al primer nodo desde el puntero
del ltimo nodo.
Lista Enlazada Doblemente Circular
En una lista enlazada doblemente circular, cada nodo tiene dos enlaces, similares a los de la lista
doblemente enlazada, excepto que el enlace anterior del primer nodo apunta al ltimo y el enlace
siguiente del ltimo nodo, apunta al primero. Como en una lista doblemente enlazada, las inserciones
y eliminaciones pueden ser hechas desde cualquier punto con acceso a algn nodo cercano. Aunque
estructuralmente una lista circular doblemente enlazada no tiene ni principio ni fin, un puntero de acceso
externo puede establecer el nodo apuntado que est en la cabeza o al nodo cola, y as mantener el
orden tan bien como una lista doblemente enlazada con falsos nodos.
Ejemplo lista enlazada simple.
package listas_enlazadas;
/**
*
* @author Juan
*/
public class Nodo {
// Variable en la cual se va a guardar el valor.
private int valor;
// Variable para enlazar los nodos.
private Nodo siguiente;
/**
* Constructor que inicializamos el valor de las variables.
*/
public void Nodo(){
this.valor = 0;
this.siguiente = null;
}
Pgina 5 de 13
}
}
package listas_enlazadas;
/**
*
* @author Juan
*/
public class Lista {
// Puntero que indica el inicio de la lista o conocida tambien
// como cabeza de la lista.
private Nodo inicio;
// Variable para registrar el tamao de la lista.
private int tamanio;
/**
* Constructor por defecto.
*/
public void Lista(){
inicio = null;
tamanio = 0;
}
/**
* Consulta si la lista esta vacia.
* @return true si el primer nodo (inicio), no apunta a otro nodo.
*/
public boolean esVacia(){
return inicio == null;
}
/**
* Consulta cuantos elementos (nodos) tiene la lista.
* @return numero entero entre [0,n] donde n es el numero de elementos
* que contenga la lista.
*/
public int getTamanio(){
return tamanio;
}
/**
* Agrega un nuevo nodo al final de la lista.
* @param valor a agregar.
*/
public void agregarAlFinal(int valor){
// Define un nuevo nodo.
Nodo nuevo = new Nodo();
// Agrega al valor al nodo.
nuevo.setValor(valor);
// Consulta si la lista esta vacia.
if (esVacia()) {
// Inicializa la lista agregando como inicio al nuevo nodo.
inicio = nuevo;
// Caso contrario recorre la lista hasta llegar al ultimo nodo
Pgina 6 de 13
Pgina 7 de 13
Pgina 8 de 13
Pgina 9 de 13
if (referencia == aux.getValor()){
// Canbia el valor de la bandera.
encontrado = true;
}
else{
// Avansa al siguiente. nodo.
aux = aux.getSiguiente();
}
}
// Retorna el resultado de la bandera.
return encontrado;
}
/**
* Consulta la posicin de un elemento en la lista
* @param referencia valor del nodo el cual se desea saber la posicin.
* @return un valor entero entre [0,n] que indica la posicin del nodo.
* @throws Exception
*/
public int getPosicion(int referencia) throws Exception{
// Consulta si el valor existe en la lista.
if (buscar(referencia)) {
// Crea una copia de la lista.
Nodo aux = inicio;
// COntado para almacenar la posicin del nodo.
int cont = 0;
// Recoore la lista hasta llegar al nodo de referencia.
while(referencia != aux.getValor()){
// Incrementa el contador.
cont ++;
// Avansa al siguiente. nodo.
aux = aux.getSiguiente();
}
// Retorna el valor del contador.
return cont;
// Crea una excepcin de Valor inexistente en la lista.
} else {
throw new Exception("Valor inexistente en la lista.");
}
}
/**
* Actualiza el valor de un nodo que se encuentre en la lista ubicado
* por un valor de referencia.
* @param referencia valor del nodo el cual se desea actualizar.
* @param valor nuevo valor para el nodo.
*/
public void editarPorReferencia(int referencia, int valor){
// Consulta si el valor existe en la lista.
if (buscar(referencia)) {
// Crea ua copia de la lista.
Nodo aux = inicio;
// Recorre la lista hasta llegar al nodo de referencia.
while(aux.getValor() != referencia){
aux = aux.getSiguiente();
}
Pgina 10 de 13
Pgina 11 de 13
Pgina 12 de 13
if (!esVacia()) {
// Crea una copia de la lista.
Nodo aux = inicio;
// Posicion de los elementos de la lista.
int i = 0;
// Recorre la lista hasta el final.
while(aux != null){
// Imprime en pantalla el valor del nodo.
System.out.print(i + ".[ " + aux.getValor() + " ]" + " ->
// Avanza al siguiente nodo.
aux = aux.getSiguiente();
// Incrementa el contador de la posicin.
i++;
}
}
");
}
}
package listas_enlazadas;
/**
*
* @author Juan
*/
public class Listas_enlazadas {
Pgina 13 de 13
lista.insertarPorReferencia(41, 5);
lista.listar();
System.out.print(" | Tamao: ");
System.out.println(lista.getTamanio());
System.out.println("\n\nInserta un nodo con valor 44 en la posicin 3");
lista.insrtarPorPosicion(3, 44);
lista.listar();
System.out.print(" | Tamao: ");
System.out.println(lista.getTamanio());
System.out.println("\nActualiza el valor 12 del tercer nodo por 13");
lista.editarPorReferencia(12, 13);
lista.listar();
System.out.print(" | Tamao: ");
System.out.println(lista.getTamanio());
System.out.println("\nActualiza el valor nodo en la posicin 0 por 17");
lista.editarPorPosicion(0, 17);
lista.listar();
System.out.print(" | Tamao: ");
System.out.println(lista.getTamanio());
System.out.println("\nElimina el nodo con el valor 41");
lista.removerPorReferencia(41);
lista.listar();
System.out.print(" | Tamao: ");
System.out.println(lista.getTamanio());
System.out.println("\nElimina el nodo en la posicin 4");
lista.removerPorPosicion(4);
lista.listar();
System.out.print(" | Tamao: ");
System.out.println(lista.getTamanio());
System.out.println("\nConsulta si existe el valor 30");
System.out.println(lista.buscar(30));
System.out.println("\nConsulta la posicion del valor 9");
System.out.println(lista.getPosicion(9));
System.out.println("\nElimina la lista");
lista.eliminar();
System.out.println("\nConsulta si la lista est vacia");
System.out.println(lista.esVacia());
System.out.println("\n\n<<-- Fin de ejemplo lista simple -->>");
}
}