El campo de datos de un nodo puede ser otra lista enlazada. Mediante este mecanismo, podemos construir muchas estructuras de datos enlazadas con listas; esta practica tiene su origen en el lenguaje de programación Lisp, donde las listas enlazadas son una estructura de datos primaria (aunque no la única), y ahora es una característica común en el estilo de programación funcional.
A veces, las listas enlazadas son usadas para implementar arrays asociativos, y estas en el contexto de las llamadas listas asociativas. Hay pocas ventajas en este uso de las listas enlazadas; hay mejores formas de implementar éstas estructuras, por ejemplo con árboles binarios de búsqueda equilibrados. Sin embargo, a veces una lista enlazada es dinámicamente creada fuera de un subconjunto propio de nodos semejante a un árbol, y son usadas más eficientemente para recorrer ésta serie de datos.
A continuacion definimos el codigo en Java de las operaciones eliminar, insertar, recorrer, buscar, vacio, tamaño.
Codigo en Java
public class Lista{
private NodoLista primerNodo;
private NodoLista ultimoNodo;
private String nombre;
//Cadena "lista, utilizada para imprimir"
//Construir lista vacia "como nombre"
public Lista ()
{
this ( "lista" );
}
//construir una lista vacia con un nombre
public Lista(String nombreLista)
{
nombre = nombreLista;
primerNodo = ultimoNodo = null;
}
//insertar objeto al frente de la lista
public synchronized void insertarAlFrente (Object elementoInsertar)
{
if(estaVacia()) //primerNodo y ultimoNodo hacen referencia al mismo objeto
primerNodo = ultimoNodo = new NodoLista (elementoInsertar);
else //primerNodo hace referencia a un nuevo nodo
primerNodo = new NodoLista (elementoInsertar, primerNodo);
}
//insertar objeto al final de la lista
public synchronized void insertarAlFinal (Object elementoInsertar)
{
if (estaVacia()) //primerNodo y ultimoNodo hacen referencia al mismo objeto
primerNodo = ultimoNodo = new NodoLista (elementoInsertar);
else // el objeto siguienteNodo que va despues de ultimoNodo hace referencia a un nuevo Nodo
ultimoNodo = ultimoNodo.siguienteNodo = new NodoLista (elementoInsertar);
}
// eliminar primer nodo de la lista
public synchonized Object eliminarDelFrente () trows ExcepcionListaVacia
{
if (estaVacia()) //lanzar exepcion si la lista esta vacia
throw new ExcepcionListaVacia (nombre);
Object elementoEliminado = primerNodo.datos; //recuperar los datos que se van a eliminar
//actualizar las referencias primerNodo y ultimoNodo
if (primerNodo == ultimoNodo)
primerNodo = ultimoNodo = null;
else
primerNodo = primerNodo.siguienteNOdo;
return elementoEliminado; // devolver datos del nodo eliminado
} //fin del metodo eliminarDelFrente
//eliminar ultimo nodo de la Lista
public synchronized Object eliminarDelFinal() throws ExepcionListaVacia
{
if (estaVacia()) //lanzar excepcion si lista esta vacia
throw new ExcepcionListaVacia (nombre);
Object elementoEliminado = ultimoNodo.datos; // recuperar los datos que se van a eliminar
// actualizar las referencias primerNodo y ultimoNOdo
if (primerNodo == ultimoNodo)
primerNodo = ultimoNodo = null;
else{ //localizar nuevo ultimo nodo
NodoLista actual = primerNodo;
// iterar mientras nodo actual no haga referencia al ultimoNodo
while (actual.siguienteNodo != ultimoNodo)
actual = actual.siguienteNodo;
ultimoNodo = actual; // actual es el nuevo ultimoNodo
actual.siguienteNodo = null;
}
return elementoEliminado; //devolver datos del nodo eliminado
} //fin del metodo eliminarDelFinal
//determinar si la lista esta vacia
public sinchronized boolean estaVacia()
{
return primerNodo == null; //devolver true si la lista esta vacia
}
// mostrar el contenido de la lista
public synchronized void imprimir()
{
if (estaVacia()){
System.out.println (nombre + "vacia");
return;
}
System.out.print("La" + nombre + "es:");
NodoLista actual = primerNodo;
//mientras no se encuentre al final de la lista, imprimir los datos del nodo actual
while (actual !=null) {
System.out.print (actual.datos.toString() + " " );
actual = actual.siguienteNodo;
}
System.out.println ("\n");
}
}