A ver si me se explicar ahora:
node es una variable puntero auxiliar. Su única función es, junto al while, encontrar el último nodo de la lista.
La variable list no se toca, es el inicio de la lista, lo que hay que regresar. Pero la lista sí que se ha modificado, ha crecido en un elemento.
node = list; es porqué la lista es un dato dinámico y no sabemos que extensión tiene pero sabemos que list, al menos, tiene un nodo válido y que ése es el primero; por tanto hay que empezar a buscar el último nodo de la lista por el primero y recorrerla hasta llegar al final.
A ver si me salen los dibujitos esquemáticos:
XXXXXXXXX <- Esto es nuestra lista
y como toda lista enlazada tiene un puntero apuntando a su cabeza
list
v
XXXXXXXXX
Y <- elemento nuevo que se debe colocar a la lista
como list no se puede tocar, que es lo que hay que regresar nos inventamos node
list
v
XXXXXXXXX <- esto es node = list
^
node
Y <- por simplicidad lo dejaré perdido por el limbo hasta que lo coloque
ahora node debe encontrar el último elemento
list
v
XXXXXXXXX
^
node
list
v
XXXXXXXXX
^
node
list
v
XXXXXXXXX
^
node
...
list
v
XXXXXXXXX
^
node
Ahora el next de node, que es exactamente lo mismo al next del último elemento enlaza a Y y virtualmente obtenemos lo siguiente
list
v
XXXXXXXXXY
node, ya no me sirve y lo dejo tranquilo. Desaparecerá cuándo desaparezca la función ya que es una variable local.
La lista se queda ya que es algo que hay en el motón y por tanto permanente.
Debo retornar list porqué apunta a la lista modificada.
Ahora me puedes decir: pero si list tiene la misma posición de memoria al principio de la función que al final, no se ha modificado en nada el valor que guarda, no hace falta devolverla.
Y te digo: sí que hace falta porqué también sirve la función para generar la lista desde cero. Si se le pasa list=NULL a la función ocurre lo siguiente:
list
v
NULL
genero un dato
list
v
NULL
X <- el dato
y enlazo list con el dato
list
v
X
Ahora si no devuelvo list fuera de la función no existiría esta modificación.