Saltar a contenido

Listas enlazadas y listas circulares

Una lista es una colección, originalmente vacía, de elementos u objetos de cualquier tipo no necesariamente consecutivos en memoria, que durante la ejecución del programa pueden crecer o decrecer elemento a elemento según las necesidades previstas en el mismo.

Una lista está formada por un número variable de datos (elementos) de un mismo tipo, ordenados según una secuencia lineal. Cada elemento, salvo el primero, tiene un predecesor en la lista. Todos los elementos, salvo el último, tienen un sucesor.

Listas enlazadas

Piensa

Si los elementos no están consecutivos en memoria ¿cómo pasamos desde un elemento al siguiente cuando recorremos la lista? La respuesta es que cada elemento debe almacenar información de dónde está el siguiente elemento o el anterior, o bien ambos.

Podemos definir una lista como una estructura de datos formada por registros de, al menos, dos campos, en que uno de ellos contiene información que permite localizar al siguiente registro en la lista según una secuencia dada.

En función de la información que cada elemento de la lista almacene respecto a la localización de sus antecesores y/o predecesores, las listas pueden clasificarse en: listas lineales simplemente enlazadas, listas lineales doblemente enlazadas, listas circulares simplemente enlazadas, y listas circulares doblemente enlazadas.

Listas lineales simplemente enlazadas

Una lista lineal simplemente enlazada es una colección de objetos (elementos de la lista), cada uno de los cuales contiene datos o una referencia a los datos, y una referencia al siguiente objeto en la colección (elemento de la lista).

Listas lineales simplemente enlazadas

class Persona {
    //atributos
    String apellido;
    Persona siguiente; //referencia al siguiente elemento
    public Persona(){ // constructor por defecto
    }
}

Listas lineales doblemente enlazadas

En algunas aplicaciones puede ser deseable recorrer eficientemente una lista, tanto hacia adelante como hacia atrás. O, dado un elemento, podría desearse determinar con rapidez el siguiente y el anterior. En tales situaciones, quizá se quisiera poner en cada nodo de una lista un puntero al siguiente nodo y otro al anterior.

Listas lineales doblemente enlazadas

class Persona {
    //atributos
    String apellido;
    Persona siguiente; //referencia al siguiente elemento
    Persona anterior; //referencia al anterior elemento
    public Persona(){ // constructor por defecto
    }
}

Listas circulares

Una lista circular enlazada es una lista en la que el último elemento apunta al primero en lugar de apuntar al vacío o NULL.

Listas circulares simplemente enlazadas

Listas circulares simplemente enlazadas

En este tipo de listas es posible acceder a cualquier elemento de la lista desde cualquier punto dado desplazándonos en un único sentido. Una representación gráfica sería la siguiente

class ListaCircular {
    private Persona cabeza; // Referencia al primer nodo
    private Persona cola;   // Referencia al último nodo

    // Constructor por defecto
    public ListaCircular() {
        this.cabeza = null;
        this.cola = null;
    }

    // Método para agregar un nodo al final de la lista
    public void agregar(String apellido) {}

    // Método para recorrer e imprimir la lista
    public void mostrar() {}
}

Listas circulares doblemente enlazadas

Listas circulares doblemente enlazadas

Una lista circular doblemente enlazada es una combinación de las listas circulares y de las listas doblemente enlazadas. Su principal ventaja es que se permite el desplazamiento en cualquier sentido a través de la misma.

class ListaCircularDoble {
    private Persona cabeza; // Referencia al primer nodo
    private Persona cola;   // Referencia al último nodo

    // Constructor por defecto
    public ListaCircularDoble() {
        this.cabeza = null;
        this.cola = null;
    }

    // Método para agregar un nodo al final de la lista
    public void agregar(String apellido) {}

    // Método para recorrer e imprimir la lista hacia adelante
    public void mostrarAdelante() {}

    // Método para recorrer e imprimir la lista hacia atrás
    public void mostrarAtras() {}
}