Scusate se intervengo solo ora, è da un po' che leggo, e solo adesso mi è venuta l'idea di unirmi, spero di non star violando nessuna regola.
La funzione non inverte la lista (fare una funzione simile sarebbe molto più lungo), ma scrive gli elementi della lista a partire dall'ultimo. Quindi di fatto scrive l'ultimo elemento, poi il penultimo e via così, senza modificare quanto scritto in memoria. Per fare questo alla finzione viene passato il puntatore a un elemento di lista (inizialmente al primo, ma vedremo che la cosa cambierà). Se quell'elemento non esiste (quindi il puntatore è null) la funzione non fa nulla, e ritorna a qualsiasi cosa la abbia chiamata. Se invece quell'elemento esiste, ne esisterà un successivo, quindi la funzione prima richiama se stessa, passandosi l'indirizzo di quel successivo, e poi, una volta che la lista è stata finita e che tutte le funzioni successive sono finite, stampa il numero che le tocca stampare, e termina, permettendo alla chiamante di continuare.
Esempio: lista di 2 elementi. Chiamo la funzione puntando al primo. Non è nullo, quindi la prima chiamata chiama la seconda puntando al secondo elemento. Non è nullo, quindi la seconda chiamata chiama una terza volta la funzione, passandogli il successivo del secondo elemento. Visto che la lista è di 2 elementi, il successivo del secondo è NULL, quindi la terza chiamata non fa nulla, e la palla ritorna alla seconda. La seconda, dopo aver chiamato la terza, scrive il secondo numero, e passa la palla alla prima chiamata, la quale scrive il primo numero