OK, ecco il mio tentativo di rendere ancora più chiara la risposta di valya (anche se pensavo che fosse già abbastanza buona):
Supponiamo di avere questa lista:
// a->b->c->d->e->NULL
Iniziamo al primo nodo, a
, che contiene un puntatore (next
) per b
:
// a->b ...
La linea next = current->next;
insiemi next
a b
(abbastanza semplice). La riga successiva current->next = result;
fa questo:
// NULL<-a b ... (notice there is no longer a pointer from a to b)
Poi abbiamo result = current;
che definisce result
-a
(di nuovo, abbastanza semplice). Infine, abbiamo l'importante current = next;
, che imposta current
su b
.
Così sulla prossima iterazione del ciclo while, con next
set per b
, result
insieme a a
, e current
insieme a b
, cominciamo sopra:
next = current->next;
// NULL<-a<-b c ...
current->next = result;
result = current;
Poi lo facciamo di nuovo:
Una volta raggiunto l'ultimo elemento nell'elenco collegato (e
in questo esempio), ciò accade:
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
Ora, dal momento che current
è nullo, il ciclo while termina e ci ritroviamo con:
*headRef = result;
che, come si può vedere ora, rende headRef
punto di e
, trattando e
come il nuovo primo articolo nel nostro elenco collegato, con e->next
che punta a d
, d->next
che punta a c
, ecc.
Puoi fornire una spiegazione schematica di come effettivamente stanno accadendo le cose in ogni fase? – Rachel
controllare il collegamento nell'altro commento: http://www.openasthra.com/c-tidbits/reverse-linked-list-using-3-ptrs/ –
Sì, la mia risposta dà una rappresentazione visiva – SwDevMan81