For those of you who got really confused of what the head->next->next is all about, here is my rewritten version, a little more verbose, but easy to C++ newbs like me:

class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (!head || !head->next) {
return head;
} else {
auto new_head = reverseList(head->next); // res is the new reversed head
auto new_tail = head->next; // we just reversed head->next, it now refers to last of new list head
new_tail->next = head; // reverse the normal way
head->next = NULL; // dereference head->next or it forms a circle
return new_head;
}
}
};