Очень долго тупил над этой задачей. На практике проще использовать чтение списка с конца. Так что задача имеет больше учебный характер. Немного погуглив нашел решение с помощью рекурсии.
Node * reverse(Node *head) { if (head == 0) return 0; if (head->next == 0) return head; Node * tmp = reverse(head->next); head->next->next = head; head->next = 0; return tmp; }