Perchè ricorsiva? Devi shiftare tuttigli elementi?
se l è un puntatore al primo elemento (beh, non ci sono molte alternative, o è un puntatore o è un puntatore a puntatore) memorizzi il primo, vai sul secondo e con un altro puntatore di supporto lo sposti indietro di una posizione finchè l non è NULL quindi ci sbatti dento il temp...

codice:
void FirstLast(ListaInteri l) {
    if(l==NULL)
        return;
    int temp; 
    temp=l->membro;
    ListaInteri *previous=l;
    l=l->next;    
    while(l!=NULL){
       previous->membro=l->membro; 
       previous=previous->next;
       FirstLast(l->next);
    }
    previous->membro=temp;
}
Non so se funzioni ma questo dovrebbe essere il procedimento corretto per quanto vuoi fare...
Ovviamente al posto di membro ci va il nome del membro della tua struttura.