Red de conocimiento informático - Conocimiento informático - Cómo revertir una lista enlazada

Cómo revertir una lista enlazada

Inversión de lista enlazada

La inversión de una lista enlazada unidireccional es una pregunta frecuente en las entrevistas y también es una pregunta muy básica. Por ejemplo, una lista enlazada se ve así: 1->2->3->4->5 se invierte y se convierte en 5->4->3->2->1. El método más simple que me viene a la mente es recorrer la lista vinculada una vez, usar un puntero auxiliar para almacenar el siguiente elemento señalado por el puntero actual durante el recorrido, luego invertir el puntero del elemento del nodo actual y luego usar el puntero almacenado. para seguir atravesando. El código fuente es el siguiente:

Estructura Karin {

int data;

Karin*next;

};

Reversión no válida (Karin* head)

{

if(head ==NULL)

Retorno;

Karin *pre,*cur,*noreste;

pre = cabeza;

cur=cabeza->siguiente;

mientras(cur)

{

ne = cur->; siguiente

cur->; siguiente = pre

pre = cur

cur = ne

}

head->; next = NULL

head = pre

}

Allí es otra forma de utilizar la recursividad. La idea básica de este método es llamar a una función recursiva para revertir los nodos posteriores antes de revertir el nodo actual. El código fuente es el siguiente. Sin embargo, este método tiene una desventaja: el último nodo después de la inversión formará un anillo, por lo que el siguiente campo del nodo devuelto por la función debe establecerse en NULL. Usé una referencia porque quería cambiar el puntero del encabezado. El código fuente del algoritmo es el siguiente:

Karin*reverse(Karin*p,Karin*amphead)

{

if(p = = NULL | p- gt; siguiente == NULL)

{

head = p;

return p;

}

Otro

{

Karin* tmp = reverso (p- gt; siguiente, cabeza

tmp- gt; ;

Devolver p;