[Base del algoritmo] Estructura de datos | Lista enlazada simple + implementación de código de lista enlazada doble + diagrama + principio

inserte la descripción de la imagen aquí

prefacio

Porque Yao Yaozi se está preparando para la Copa Blue Bridge y la competencia de selección ACM en la escuela, y recientemente está aprendiendo sobre algoritmos. Aprendí con la ayuda del sitio web AcWing. Este artículo es una nota sobre mi contenido de aprendizaje. Algunas de las explicaciones de los principios son amigos que pueden ver viñetas o comentarios durante mi proceso de aprendizaje. Creo que es muy bueno .
Este artículo trata sobre las estructuras de datos, principalmente el uso de matrices para simular varias estructuras de datos, principalmente para mejorar la eficiencia de los algoritmos.
Para algunos lugares que son relativamente oscuros y calvos, estoy acostumbrado a hacer dibujos para entender, por lo que verá mis diagramas cuidadosamente elaborados basados ​​en plantillas o temas de algoritmos. ¡Espero que pueda ayudar a los estudiantes que están aprendiendo algoritmos juntos!
Debido a que Yaoyaozi todavía es un novato en este momento, puede haber partes donde no entiendo bien, o donde puedo entender mejor. ¡Por favor, señale más!

¡Aviso! El método de explicación de cada estructura de datos a continuación adopta una plantilla de código + descripción y explicación de texto + diagrama

1. Lista enlazada individualmente (lista de adyacencia)

Función: se utiliza principalmente para la lista de adyacencia , el gráfico de almacenamiento y el árbol.

plantilla de código

// head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点,后一个
int head, e[N], ne[N], idx;
//NULL相当于-1,所以head = -1相当于head=NULL
// 初始化
void init()
{
    
    
    head = -1;
    idx = 0;
}

// 在链表头插入一个数a
void insert(int a)
{
    
       
    e[idx] = a, ne[idx] = head, head = idx ++ ;
}
//将x插入到下标是k的点之后
void insert(int k, int x)
{
    
    
	e[idx] = x;
	ne[idx] = ne[k]
	ne[k] = idx;
	idx ++;
}

// 将头结点删除,需要保证头结点存在
void remove()
{
    
    
    head = ne[head];
}
  • La matriz de nodos de almacenamiento e[N]y la siguiente matriz de punteros que almacenan el nodo ne[N]se asocian a través de subíndices
  • idx solo registra la posición de la operación actual, y la lista vinculada generalmente implementada idx está fuera de servicio (los subíndices de matriz de los nodos frontal y posterior no necesitan ser continuos, y el siguiente idx debe encontrarse a través del ne actual [i] Esta es también la conexión entre los dos .
  • Al comienzo de la cabecera =-1, este -1 es equivalente a la dirección física NULL, lo que indica que la lista enlazada está vacía, es decir, la cabecera apunta a un nodo principal, y el método de interpolación de la cabecera se usa para hacer inteligentemente que este nodo vacío sea un nodo de cola . Por lo tanto , el campo puntero del último nodo de la lista enlazada individualmente realizado por la estructura de asociación es NULL, la matriz realiza el último nodo de la lista enlazada individualmente, asumiendo que es i, luego ne[i]=-1;
  • Lo que se simula aquí es que no hay un nodo principal, y el puntero de la cabeza apunta directamente a la lista enlazada del nodo principal.
  • Aunque la lista enlazada simulada por el arreglo no es bien entendida por la simulación de estructura/clase, la esencia es la misma, podemos compararla con un nodo Node.
  • Entonces, de hecho, al dibujar una imagen, no hay necesidad de dividirla tan claramente. De hecho, antes de aprender a simular listas enlazadas con matrices, siempre pensé que las matrices y las listas enlazadas pertenecían a estructuras físicas . Solo ahora lo hice . ¡descubra que las listas enlazadas son en realidad una estructura lógica!
punto de comparación Nodo simulado de estructura/clase Nodo analógico de matriz
puntero del propio nodo dirección física, nodo Al subíndice de la matriz, representa su propio puntero
Campo numérico Solo defínalo en la estructura.node.val val[nodo], a través de la matriz para almacenar el campo de valor
campo de puntero definido en la estructura,node. next siguiente [nodo], almacenado a través de una matriz

Operación de inserción gráfica (método de inserción de la cabeza)
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

2. Lista de enlaces dobles

Después de aprender acerca de las matrices para simular listas de enlace único, las listas de enlace doble son realmente fáciles de entender. De hecho, hay un campo puntero más.

  • Lista enlazada simple: ne[i] almacena el siguiente puntero del nodo cuyo puntero es i
  • lista de doble enlace
    • l[i], el predecesor del nodo cuyo puntero es i (apuntando al nodo anterior)
    • r[i], el backdriver del nodo cuyo puntero es i (apuntando al siguiente nodo)
//e[index],表示节点的值,l[index]表示节点的左指针,r[index]表示节点的右指针,idx表示当前用到哪个节点的”地址“

int e[N],l[N],r[N],idx;

//初始化
void init(){
    
    
  //0是左端点,1是右端点
  r[0] = 1,l[1] = 0;
  idx = 2;
}
//在节点a的右边插入一个数x
void insert(int a,int x){
    
    
  //1、让待插入节点占位
  e[idx] = x;
  //2、处理待插入点左右两侧
  l[idx] = a,r[idx] = r[a];//注意,这里必须是r[a],因为a的下一个节点不一定和a顺序存储
  //3、处理前一个节点和后一个节点
  l[r[a]] = idx,r[a] = idx++;
}

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí
Java Island Adventures [Road from Little White to Boss]

Pregunta diaria de LeetCode: Ataque a la gran fábrica

Supongo que te gusta

Origin blog.csdn.net/Yaoyao2024/article/details/129621855
Recomendado
Clasificación