typedef struct nodo *lista;
struct nodo {
int val;
lista next;
}

lista scambia(lista l)
{
lista p = l;
int aus;
while (p->next != NULL)
p = p->next;
aus = l->val;;
l->val = p->val;
p->val = aus;
return l;
}

La funzione ritorna un tipo lista.
La chiamata della funzione deve essere:

L = scambia(L);

quindi L va sia come parametro che come variabile a cui assegnare il valore di ritorno!