Estructura de datos (dos) lista enlazada circular y lista doblemente enlazada

Lista enlazada circular

Cambiar el extremo del puntero del nodo terminal en la lista enlazada individualmente de un puntero nulo al nodo principal hace que toda la lista enlazada individualmente forme un anillo. Esta lista enlazada individualmente se llama lista enlazada individualmente o lista enlazada circular para abreviar). Como una lista enlazada individualmente, una lista enlazada circular no necesariamente tiene que tener un nodo principal, pero una lista enlazada circular con un nodo principal hace que el procesamiento de una lista enlazada vacía y una lista enlazada no vacía sea consistente.
1

En este caso, el acceso al primer elemento requiere O (1) O (1)O ( 1 ) tiempo, pero para acceder al último elemento se requiereO (n) O (n)O ( n ) . El puntero sucesor de la lista enlazada circular con el nodo principal apunta al nodo principal.

Lista doblemente enlazada

Existe un problema con las listas enlazadas individualmente y las listas enlazadas circulares. Cuando visitamos un elemento, la complejidad del tiempo es O (1) O (1)O ( 1 ) , el momento para visitar nuevamente la próxima vez esO (n) O (n)O ( n ) Para solucionar este problema, se inventó una lista doblemente enlazada.
2
Si se trata de una lista doble enlazada vacía, los punteros frontal y posterior del nodo principal apuntan al mismo nodo principal.

Una lista enlazada doble es para establecer un campo de puntero a su nodo predecesor en cada nodo de la lista enlazada individualmente. La lista doblemente enlazada tiene dos campos de puntero, uno al predecesor y otro al sucesor. Su estructura se puede diseñar como:

typedef struct DulNode
{
    
    
	int data;
	struct DulNode * prev;
	struct DulNode * next;
}DulNode,

typedef DulNode * pDuLinkList;

La lista doblemente enlazada tiene la siguiente ecuación:

p->next->prev=p=p->prior->next;

La lista doblemente enlazada facilita el recorrido inverso, pero también aporta espacio de almacenamiento y complejidad operativa. Por ejemplo, operación de inserción:
3
asumiendo que p apunta al nodo N2, entonces p-> next apunta a N3, y s apunta al nodo donde N se va a insertar.

s->next=p->next;
s->prev=p->next->prev;
p->next=s;
p->next->prev=s;

Tenga en cuenta que la información del nodo original se envía primero al nuevo nodo para su procesamiento.
4
Suponiendo que p apunta al nodo B que se va a eliminar, entonces p-> next apunta a C, y p-> prev apunta a A.

p->prev->next=p->next;
p->next->prev=p->prev;
free(p);

Supongo que te gusta

Origin blog.csdn.net/weixin_39258979/article/details/115096340
Recomendado
Clasificación