I'd make a helper function that takes the original list and the reversed list as parameters. Inside the helper function, if the original list has any elements in it, move the head from the original list to the head of the reversed list, and then call the helper function again from itself.
Code:
Node *rev_helper(Node *list, Node *reversed)
{
if (list) {
Node *next = list->next;
list->next = reversed;
return rev_helper(next, list);
}
return reversed;
}
Node *rev(Node *list)
{
return rev_helper(list, NULL);
}
Untested.