Algoritmo interesante - Lista enlazada: la combinación perfecta de flexibilidad y eficiencia

1. El encanto único de la lista enlazada

1.1 Introducción y definiciones

La lista enlazada (Linked List) es una estructura de datos básica común. Almacena datos mediante "enlaces", lo que equivale a almacenar datos dispersos en la memoria. Cada parte de los datos consta de un elemento de almacenamiento y un puntero. Entre ellos, los Elementos de almacenamiento se utilizan para almacenar o representar datos, y los punteros se utilizan para marcar la dirección del siguiente elemento de almacenamiento.De esta manera, los datos dispersos se vinculan para formar un sistema completo de almacenamiento y representación de datos.

1.2 ¿Por qué usar una lista enlazada?

En comparación con otras estructuras de datos lineales, como las matrices, las listas enlazadas tienen muchas ventajas y características. Las siguientes son las principales razones para usar listas enlazadas:

  • Asignación de memoria flexible : la lista vinculada no necesita ocupar espacio continuo en la memoria, por lo que en términos de utilización de la memoria, la lista vinculada puede dispersar el uso de la memoria y ser más flexible. Además, dado que la adición y eliminación de nodos no requiere una migración de datos a gran escala, las listas enlazadas son más eficientes en las operaciones de inserción y eliminación.

  • Inserción y borrado eficiente : En un arreglo, insertar y borrar un elemento requiere mover una gran cantidad de elementos, mientras que en una lista enlazada, solo necesitamos cambiar el puntero correspondiente, lo que hace que las operaciones de inserción y borrado sean muy eficientes.

  • Se puede extender fácilmente a otras estructuras de datos : la lista enlazada se puede extender fácilmente a otras estructuras de datos, como pilas, colas, tablas hash, gráficos, etc., mostrando su gran escalabilidad.

En general, las listas vinculadas tienen una gran flexibilidad y eficiencia debido a sus métodos especiales de almacenamiento. Las listas vinculadas son obviamente más adecuadas que las matrices para resolver ciertos problemas, como escenarios que requieren la inserción y eliminación frecuente de elementos de datos. Por lo tanto, entender y dominar las listas enlazadas es el conocimiento básico que todo aquel que estudia informática y programación necesita dominar.

2. Explora los nodos de la lista enlazada

2.1 Composición de los nodos

Los elementos básicos de una lista enlazada son los nodos. Cada nodo consta de dos elementos básicos: un área para almacenar datos (generalmente llamado elemento o campo de datos) y uno o más enlaces que apuntan a otros nodos en la lista enlazada. El número de enlaces depende del tipo de lista enlazada: cada nodo de una lista enlazada simple tiene un enlace que apunta al nodo siguiente, cada nodo de una lista enlazada doble tiene dos enlaces que apuntan al nodo anterior y al nodo siguiente respectivamente, y el último nodo de una lista enlazada circular tiene uno El enlace apunta al primer nodo de la lista enlazada.

2.2 Modo de conexión entre nodos

Como se mencionó anteriormente, cada nodo en una lista enlazada individualmente contiene solo un enlace al siguiente nodo. Por lo tanto, la conexión entre nodos es unidireccional, desde el nodo principal de la lista enlazada hasta el nodo final de la lista enlazada. Además, las listas enlazadas suelen tener un nodo principal especial (cabeza) como punto de partida de la lista enlazada y, a veces, un nodo final (cola) como punto final de la lista enlazada. No contienen datos reales y solo juegan un papel. papel auxiliar.

La lista doblemente enlazada contiene dos enlaces, uno que apunta al nodo anterior y otro que apunta al siguiente nodo. Por lo tanto, los nodos en la lista de enlaces dobles están conectados bidireccionalmente, y la lista enlazada completa se puede recorrer hacia adelante o hacia atrás desde cualquier nodo.

Una lista enlazada circular es una lista enlazada especial cuyo último nodo tiene un enlace que apunta al primer nodo de la lista enlazada, formando una estructura de anillo. Para una lista enlazada circular unidireccional, este enlace apunta al nodo principal; para una lista enlazada circular bidireccional, además de un enlace que apunta al nodo principal, también hay un enlace que apunta al nodo final.

2.3 Implementación de nodos

En programación, los nodos de listas enlazadas generalmente se implementan usando clases o estructuras. Por ejemplo, en Java, la implementación más básica de un nodo de lista enlazada individualmente podría ser la siguiente:

public class Node {
    
    
    int data;
    Node next;
}

Esta clase define un nodo, que se datautiliza para almacenar datos y nextenlaces al siguiente nodo. La implementación del nodo de lista de doble enlace agrega un enlace al nodo anterior sobre esta base:

public class Node {
    
    
    int data;
    Node next;
    Node prev;
}

Lo anterior es la descripción general del nodo de lista enlazada, que es la unidad básica de la lista enlazada, conectada a otros nodos a través de punteros o referencias, formando una estructura de lista enlazada compleja. Comprender la estructura de los nodos es la clave para comprender el mecanismo de funcionamiento de las listas enlazadas.

Tres, el funcionamiento básico de la lista enlazada.

Como estructura de datos básica, la lista enlazada tiene algunas operaciones básicas, que incluyen inserción, eliminación, búsqueda y recorrido. A continuación describimos cada operación en detalle.

3.1 Operación de inserción

La operación de inserción incluye insertar un nodo al principio de la lista vinculada, insertar un nodo al final de la lista vinculada e insertar un nodo en el medio de la lista vinculada. El código de implementación específico es el siguiente:

public class LinkedList {
    
    
    Node head; 

    class Node {
    
    
        int data;
        Node next;

        Node(int d) {
    
    
            data = d;
            next = null;
        }
    }

    public void push(int new_data) {
    
       // 在链表头部插入节点
        Node new_node = new Node(new_data);
        new_node.next = head;
        head = new_node;
    }

    public void insertAfter(Node prev_node, int new_data) {
    
      // 在给定节点后插入节点
        if (prev_node == null) {
    
    
            System.out.println("The given previous node cannot be null");
            return;
        }

        Node new_node = new Node(new_data);
        new_node.next = prev_node.next;
        prev_node.next = new_node;
    }

    public void append(int new_data) {
    
      // 在链表尾部插入节点
        Node new_node = new Node(new_data);

        if (head == null) {
    
    
            head = new Node(new_data);
            return;
        }

        new_node.next = null;

        Node last = head;
        while (last.next != null) {
    
    
            last = last.next;
        }

        last.next = new_node;
        return;
    }
}

3.2 Operación de borrado

La operación de eliminación incluye eliminar el nodo principal de la lista vinculada, eliminar el nodo final de la lista vinculada y eliminar un nodo específico en la lista vinculada. El código de implementación específico es el siguiente:

public void deleteNode(int key) {
    
     // 删除键为key的节点
    Node temp = head, prev = null;

    if (temp != null && temp.data == key) {
    
    
        head = temp.next;
        return;
    }

    while (temp != null && temp.data != key) {
    
    
        prev = temp;
        temp = temp.next;
    }

    if (temp == null) return;

    prev.next = temp.next;
}

3.3 Operación de búsqueda

La operación de búsqueda se utiliza para encontrar un elemento específico en la lista enlazada. El código de implementación específico es el siguiente:

public boolean search(Node head, int x) {
    
      // 在链表中查找键为x的节点
    Node current = head;
    while (current != null) {
    
    
        if (current.data == x) {
    
    
            return true;
        }
        current = current.next;
    }
    return false;
}

3.4 Operación transversal

La operación transversal se utiliza para acceder a cada elemento de la lista enlazada. El código de implementación específico es el siguiente:

public void printList() {
    
      // 打印链表的所有节点
    Node tnode = head;
    while (tnode != null) {
    
    
        System.out.print(tnode.data+" ");
        tnode = tnode.next;
    }
}

Las anteriores son algunas operaciones básicas de la lista enlazada. A través de estas operaciones, podemos leer, escribir, modificar y otras operaciones en la lista enlazada. existir

En el uso real, las operaciones de la lista enlazada pueden ser más complicadas, incluida la clasificación, la inversión, etc., pero básicamente se pueden atribuir a la combinación de estas operaciones básicas.

4. El mundo de las listas enlazadas: no solo listas enlazadas unidireccionales

Una lista enlazada es una estructura de datos común utilizada para almacenar y organizar datos. Además de la lista enlazada unidireccional común, existen otros tipos de listas enlazadas, como la lista doblemente enlazada, la lista circular enlazada, la lista saltada enlazada y la lista enlazada XOR, etc.
4. El mundo de las listas enlazadas: no solo listas enlazadas unidireccionales

El mundo de las listas enlazadas es rico y colorido, y tienen sus propias ventajas, que son adecuadas para resolver varios problemas. Veamos algunas de estas formas:

4.1 Lista doblemente enlazada

Como sugiere el nombre, una lista doblemente enlazada significa que cada nodo tiene dos enlaces, uno que apunta al nodo anterior y el otro que apunta al siguiente nodo. Una propiedad importante de una lista doblemente enlazada es que se puede recorrer en ambas direcciones. Esto facilita la realización de operaciones como pasar de un nodo al anterior o insertar nuevos nodos entre nodos. Cuando insertamos o eliminamos un nodo, podemos encontrar directamente el nodo anterior sin atravesar desde el principio. Esta es una gran ventaja de la lista doblemente enlazada: fácil operación y alta eficiencia. Específicamente, la lista doblemente enlazada puede admitir la eliminación e inserción de nodos en ambos extremos con una complejidad de tiempo O(1).

El código Java del nodo de la lista doblemente enlazada se expresa de la siguiente manera:

class Node {
    
    
    int data;       // 节点数据
    Node next;      // 指向下一个节点的指针
    Node prev;      // 指向前一个节点的指针

    Node(int d) {
    
    
        data = d;
        next = null;
        prev = null;
    }
}

4.2 Lista enlazada circular

Una lista enlazada circular es una forma única de lista enlazada en la que el último elemento apunta al primer elemento de la lista enlazada. Esta característica hace que la transición de cola de cadena a cabeza de cadena sea muy rápida. Una lista enlazada circular puede ser una lista enlazada circular única o una lista enlazada circular doble. Esta estructura de lista enlazada es especialmente adecuada para tratar problemas de estructura circular, como colas circulares, problemas de Joseph, etc.
La siguiente es una representación de una lista enlazada circular en Java de la siguiente manera:

Copy code
class Node {
    
    
    int data;        // 节点数据
    Node next;       // 指向下一个节点的指针

    Node(int d) {
    
    
        data = d;
        next = this; // 在创建节点时,将next指向自身,形成一个单节点的循环链表
    }
}

4.3 Otros formularios de lista enlazada

Además de los formularios de lista enlazada comunes mencionados anteriormente, existen otras formas de listas enlazadas, como la lista de omisión, la lista enlazada XOR, etc., que tienen sus escenarios de aplicación especiales y objetivos de optimización. Por ejemplo, la lista de enlaces de salto se utiliza principalmente para optimizar el rendimiento de la búsqueda y lograr una búsqueda rápida mediante el establecimiento de un índice de varios niveles; la lista de enlaces XOR es un formulario de lista enlazada que optimiza los requisitos de espacio de almacenamiento en un entorno con limitaciones de memoria.

Podemos ver que el mundo de las listas enlazadas es rico y colorido. Aunque varias formas de listas enlazadas tienen sus propias características, todas sus operaciones e ideas básicas se originan en el concepto básico de listas enlazadas. Una vez que hayamos dominado estos conceptos básicos, podemos utilizar con flexibilidad varias formas de listas enlazadas para resolver mejor los problemas prácticos.

V. Resumen

La lista enlazada, esta estructura de datos aparentemente simple, contiene un contenido extremadamente rico. Puede ser tan simple como un camino de avance de un solo sentido, o tan complicado como un camino de dos sentidos, o incluso una trayectoria de circuito cerrado. El encanto de la lista enlazada radica en su método de almacenamiento de datos flexible, que puede realizar operaciones de inserción y eliminación en la secuencia de datos a un costo muy bajo, y es especialmente adecuado para escenarios donde se desconoce la cantidad de datos o se requieren operaciones frecuentes.

En el proceso de aprendizaje de listas enlazadas, también aprendimos sobre algunas formas especiales de listas enlazadas, como listas doblemente enlazadas, listas enlazadas circulares y listas de salto más avanzadas. Aunque en el desarrollo diario, es posible que no implementemos directamente estas estructuras de datos, pero comprenderlas puede ayudarnos a comprender y usar las estructuras de datos integradas del lenguaje y las bibliotecas de clases con mayor profundidad.

Por supuesto, las listas enlazadas son solo la punta del iceberg de las estructuras de datos. En el mundo de las estructuras de datos, hay estructuras de datos más complejas y poderosas que nos esperan para explorar, como árboles, gráficos, montones y tablas hash. Cada estructura de datos tiene sus escenarios de aplicación específicos, aprenderlos y dominarlos nos permitirá avanzar más en el camino de la programación. En el próximo blog, continuaré llevándolos a explorar el mundo de las estructuras de datos en profundidad, ¡así que estén atentos!

"Explore sin fin, aprenda sin fin", seguimos avanzando en el viaje de algoritmos interesantes, ¡y esperamos que cada paso pueda brindarle nueva inspiración y diversión!

Supongo que te gusta

Origin blog.csdn.net/weixin_46703995/article/details/131317967
Recomendado
Clasificación