Given the head of a singly linked list, reverse the list, and return the new head node. The linked list is defined as follows:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def reverse_list(head: Optional[ListNode]) -> Optional[ListNode]: