La definición que daremos sobre una lista enlaza es muy breve y puede ser la siguiente: Una lista enlazada es una colección de datos que hacen referencia a una clase. Ya que los datos almacenados pueden ser de una clase en especial que usted a creado para diferentes propósitos.

Por ejemplo: usted estará creando una clase que solamente se encargue de almacenar números enteros o una clase «generica» mediante la cual usted pueda guardar información del usuario, ya sea una clase de tipo: empleado, persona, entre otros.

Crear nuestra listas enlazadas de manera personalizada ofrece una gran serie de ventajas en diversos aspectos, pues usted seria capaz de implementar funciones que por defecto la clase ArrayList<> de java no tiene. Una de esas funciones podría ser: devolver el numero anterior y siguiente del numero buscado.

Ejemplo:

usted tiene una lista enlazada con los siguientes datos: 1–>2–>8–>5–>

desea buscar el numero 8, los números (nodos) serian los siguientes:

anterior=2 y siguiente=5, esto solo es un ejemplo sencillo ya que usted podría realizar cosas más interesantes.

Comencemos creando un nuevo proyecto, puede ponerle cualquier nombre. Posteriormente creamos una clase NodoLista, esta clase permite definir el tipo de información que usted desea almacenar en su lista enlazada, como decía anteriormente esta información puede ser de tipo: entero (en este ejemplo se muestra asi) o incluso usted sera capaz de pasar por parametro una clase creada (personalizada).


package default;

public class NodoLista {

NodoLista sig;
int dato;

public NodoLista(int dato) {
this.dato=dato;
sig=null;
}

}

Realmente esta clase no tiene nada complejo, solo recibe por parametro el tipo de dato que desea recibir y el «puntero» (en java no existe ese termino, para fines prácticos lo llamaremos asi). El «puntero» o referencia simplemente se encarga de apuntar la información creando una colección en forma de lista enlazada, en realidad esta variable hace referencia a la ubicación del nodo a apuntar.

El «puntero» en este caso es la variable siguiente, esta debe ser igual a null ya que no esta haciendo referencia a ningún dato.

La siguiente clase Lista, debe contener toda la logica que cumpla con el comportamiento de una lista enlazada, aqui nosotros nos encargaremos de crear los metodos necesarios para que todo funcione de acuerdo a nuestras necesidades.

A diferencia de la cola y pila una lista no tiene una regla que seguir al insertar datos, una lista enlazada permite insertar al frente, final o en cierto punto especifico.


package default;

public class Lista {

NodoLista ini, fin;
int tamanio;

public Lista() {
ini=fin=null;
}

public boolean estaVacia() {
return ini==null;
}

public void insertarFinal(int dato) {
NodoLista nuevo=new NodoLista(dato);
if(estaVacia()) {
ini=nuevo;
}else {
fin.sig=nuevo;
}
fin=nuevo;
tamanio++;
}

public void insertarInicio(int dato) {
NodoLista nuevo=new NodoLista(dato);
if(estaVacia()) {
fin=nuevo;
}else {
nuevo.sig=ini;
}
ini=nuevo;
tamanio++;
}

public int borrarDelInicio() {

int elemento = inicio.dato;

if(inicio==fin) {
inicio=null;
fin=null;
}else {
inicio=inicio.siguiente;
}

return elemento;

}

public int borrarDelFinal() {

int elemento = fin.dato;

if(inicio==fin) {
inicio=null;
fin=null;
}else {
Nodo temporal=inicio;

while(temporal.siguiente!=fin) {
temporal=temporal.siguiente;
}

fin=temporal;
fin.siguiente=null;
}

return elemento;

}

public void mostrarLista() {
NodoLista recorrer=ini;
System.out.println();
while(recorrer!=null) {
System.out.print("[" + recorrer.dato + "]------&gt;;");
recorrer = recorrer.sig;
}
}

}

El código de esta clase solo contiene las funciones principales de insertar, borrar y mostrar. Sin embargo, usted sera capaz de personalizar o agregar nuevos metodos.

Finalmente creamos una clase donde nos encargaremos de llamar a nuestros metodos creados y poner en marcha todo el código:


package default;

import javax.swing.JOptionPane;

public class ListaSimpleEnlazada {

public static void main(String[] args) {

Lista mylista=new Lista();

int select=0;
int dato_inicio;

do {

try {
select = Integer.parseInt(JOptionPane.showInputDialog(null,
"1=Agregar elemento al inicio de la lista"
+ "\n2=Agregar elemento al final de la lista"
+ "\n3=Eliminar un elemento del inicio de la lista"
+ "\n4=Eliminar un elemento del Final de la lista"
+ "\n5=Mostrar los datos de la lista"
+ "\n6=Salir", "Menu de Opciones", 3));

switch(select) {

case 1:
try {
dato_inicio = Integer.parseInt(JOptionPane.showInputDialog(null, "Inserta un elemento",
"Insertando al inicio", 3));
mylista.agregarInicio(dato_inicio);
}catch(NumberFormatException e) {
JOptionPane.showMessageDialog(null, "Error" + e.getMessage());
}
break;

case 2:
try {
dato_inicio = Integer.parseInt(JOptionPane.showInputDialog(null, "Inserta un elemento",
"Insertando al final", 3));
mylista.agregarFinal(dato_inicio);
}catch(NumberFormatException e) {
JOptionPane.showMessageDialog(null, "Error" + e.getMessage());
}
break;

case 3:
dato_inicio = mylista.borrarDelInicio();
JOptionPane.showMessageDialog(null, "El elemento eliminado es: " + dato_inicio,
"Eliminando nodo del inicio", JOptionPane.INFORMATION_MESSAGE);
break;

case 4:
dato_inicio = mylista.borrarDelFinal();
JOptionPane.showMessageDialog(null, "El elemento eliminado es: " + dato_inicio,
"Eliminando nodo del Final", JOptionPane.INFORMATION_MESSAGE);
break;

case 5:
mylista.mostrarLista();
break;

case 6:
break;

default:
JOptionPane.showMessageDialog(null, "Opcion Incorrecta");
}

}catch(NumberFormatException e) {
JOptionPane.showMessageDialog(null, "Error" + e.getMessage());
}

}while(select!=6);

}

}

Si usted tiene un buen conocimiento en java le resultara facil entender el código, sino es asi ¡animo! siga practicando y estudiando, pronto vera la luz al final del tunel.