In effetti è un poco complicato da capire![]()
Provando ad eseguirla sulla carta in effetti funziona in modo furbo, provo a spiegarmi:
- il pratica viene chiamata successivamente la funzione con tutti gli elementi della lista
in ordine (ricorsione)
- quando arriva all'ultimo elemento la ricorsione finisce e viene eseguito il backtracking
- il back tracking come dice il nome procede per ogni elemento a ritroso e se faccio
L->next->next = L in pratica non faccio che dire che l'elemento successivo di quello
che sto considerando punta a me medesimo; la cosa non chiara era perchè mettevo a null
il next dell'elemento corrente (in fondo c'erano anche gli altri elementi); in effetti però
quell'assegnamento viene sovrascritto nel back tracking successivo; questo però
non avviene per il primo elemento che fa uscire dalla funzione che quindi ha next uguale
a NULL in quanto in effetti ora è l'ultimo elemento della lista;
- l'ultima furbata è quella di salvarsi il temp prima della ricorsione e ritornare L quando a finito la
ricorsione...in questo modo si salva l'elemento corrente e ritorna sempre quello (quindi alla fine
ritorna l'ultimo elemento della lista originale che è la testa della lista invertita)
Proprio una furbata.
Proviamo la lista A->B->C (se ci riesco):
1) InvertiLista(A)
2) InvertiList(B)
3) InvertiLista(C)
ora mi fermo e ritorno C quindi in 2 ho temp = C, L = B quindi L->next->next è in realtà
B->next->next=B che è anche C->next = B, inoltre metto B->next = NULL; poi torno C
poi ritorno in 1 e ho temp = C, L=A quindi L->next->next è in realtà A->next->next=A che è
anche B->next=A, e poi A->next = null, poi torno ancora C
a questo punto esco da 1 con:
C->B->A
Spero di aver capito e nel caso di essermi spiegato...![]()
Per i siti mi spiace ma non ne conosco![]()

Rispondi quotando