OK, aquí está mi intento de hacer que la respuesta de valya sea aún más clara (aunque pensé que ya era bastante buena):
Digamos que tenemos esta lista:
// a->b->c->d->e->NULL
Empezamos en el primer nodo, a
, que contiene un puntero (next
) a b
:
// a->b ...
La línea de next = current->next;
conjuntos next
a b
(Suficientemente simple). La siguiente línea current->next = result;
hace esto:
// NULL<-a b ... (notice there is no longer a pointer from a to b)
entonces tenemos que establece result = current;
result
-a
(de nuevo, bastante simple). Y, por último, tenemos el importantísimo current = next;
, que establece current
en b
.
Así que en la siguiente iteración del bucle while, con next
conjunto de b
, result
conjunto de a
y current
conjunto de b
, empezamos de nuevo:
next = current->next;
// NULL<-a<-b c ...
current->next = result;
result = current;
Entonces lo hacemos de nuevo:
next = current->next;
// NULL<-a<-b<-c d ...
current->next = result;
result = current;
Una vez que hemos llegado al último elemento en la lista vinculada (e
en este ejemplo), esto sucede:
next = current->next; // next becomes NULL
// NULL<-a<-b<-c<-d<-e
current->next = result;
result = current; // result is now e
current = next; // current is now NULL
Ahora, ya current
es NULL, el bucle while termina, y nos quedamos con:
*headRef = result;
que, como se puede ver ahora, hace headRef
punto a e
, el tratamiento de e
como el primer elemento nuevo en nuestra lista vinculada, con e->next
apuntando a d
, d->next
apuntando a c
, etc.
¿Puede proporcionar una explicación diagramática de cómo están sucediendo las cosas en cada paso? – Rachel
revise el enlace en el otro comentario: http://www.openasthra.com/c-tidbits/reverse-linked-list-using-3-ptrs/ –
Sí, mi respuesta da una representación visual – SwDevMan81