--- title: '206. Reverse Linked List' description: Given the head of a singly linked list, reverse the list, and return the reversed list icon: dot topics: - { name: "Linked List", slug: "linked-list" } - { name: "Recursion", slug: "recursion" } video: "G0_I-ZF0S38" issue: "https://github.com/prdlk/leetcode/issues/77" sidebar: label: 'Reverse Linked List' badge: 'Easy' --- ::::warning A linked list can be reversed either iteratively or recursively. Could you implement both? :::: ### Example 1: - Input: `head = [1,2,3,4,5]` - Output: `[5,4,3,2,1]` ### Example 2: - Input: `head = [1,2]` - Output: `[2,1]` ### Example 3: - Input: `head = []` - Output: `[]` ### Constraints: - The number of nodes in the list is the range [0, 5000]. - `-5000 <= Node.val <= 5000` ## Approach ```mermaid flowchart TD S(["reverseList(head)"]) --> I["prev = None, curr = head"] I --> W{"curr?"} W -- no --> E(["return prev — the old tail is the new head"]) W -- yes --> A["next_ = curr.next — save it before overwriting"] A --> B["curr.next = prev — flip the link"] B --> C["prev = curr; curr = next_ — step forward"] C --> W ``` ## Solution ```py # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: prev = None curr = head while curr: next_ = curr.next curr.next = prev prev = curr curr = next_ return prev ```