Given the head of a singly linked list, reverse the list, and return the reversed list.

Input: head = [1,2,3,4,5]
Output: [5,4,3,2,1]

Input: head = [1,2]
Output: [2,1]
Input: head = []
Output: []
The number of nodes in the list is the range [0, 5000].
-5000 <= Node.val <= 5000
A linked list can be reversed either iteratively or recursively. Could you implement both?
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* reverseList(ListNode* head) {
ListNode *nextNode, *prevNode = NULL;
while (head) {
nextNode = head->next;
head->next = prevNode;
prevNode = head;
head = nextNode;
}
return prevNode;
}
};
class Solution {
public:
ListNode* reverseList(ListNode *head, ListNode *nextNode = NULL, ListNode *prevNode = NULL) {
return head ? reverseList(head->next, (head->next = prevNode, nextNode), head) : prevNode;
}
};
[1] https://leetcode.com/problems/reverse-linked-list/solutions/803955/c-iterative-vs-recursive-solutions-compared-and-explained-99-time-85-space/
[2] https://leetcode.com/problems/reverse-linked-list/solutions/3211778/using-2-methods-iterative-recursive-beats-97-91/