What if the last link could magically flip the entire chain backward all by itself?
Why Reverse a Singly Linked List Recursive in DSA Typescript?
Imagine you have a long chain of paper clips linked one after another. You want to flip the entire chain so the last clip becomes the first and the first becomes the last.
Doing this by hand means unhooking each clip and reattaching it in reverse order, which is slow and tricky.
Manually reversing the chain clip by clip is slow and easy to mess up. You might lose track of which clip connects to which, causing the chain to break.
Similarly, reversing a linked list by manually changing each link one by one without a clear plan can cause errors and takes many steps.
Using recursion to reverse a singly linked list is like asking the last clip to take charge and flip the chain backward step by step.
This method elegantly flips the links by letting each clip point back to the previous one automatically, without losing track.
function reverseList(head: ListNode | null): ListNode | null {
let previous = null;
let current = head;
while (current !== null) {
let next = current.next;
current.next = previous;
previous = current;
current = next;
}
return previous;
}function reverseList(head: ListNode | null): ListNode | null {
if (head === null || head.next === null) return head;
let newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}This recursive approach makes reversing linked lists simple, clean, and less error-prone, enabling smooth handling of complex linked data.
Think of undoing a stack of tasks you did one after another. Recursion helps you go back step by step, reversing the order perfectly without losing any task.
Manual reversal is slow and error-prone.
Recursion flips links elegantly by letting the last node lead.
Recursive reversal is cleaner and easier to understand.
Practice
Solution
Step 1: Understand recursion on linked list
Recursion works by solving a smaller part first, here reversing the rest of the list beyond the current node.Step 2: Fix current node's pointer after recursion
After the rest is reversed, the current node's next node points back to it, reversing the link.Final Answer:
Reverse the rest of the list first, then fix the current node's next pointer -> Option CQuick Check:
Recursive reversal = reverse rest + fix pointer [OK]
- Trying to swap node values instead of pointers
- Not fixing the current node's next pointer after recursion
- Using iteration instead of recursion
Solution
Step 1: Identify when recursion should stop
The base case is when the list is empty or has only one node, so no reversal needed.Step 2: Check the correct base case syntax
Return the head if it is null or its next is null, meaning end or single node.Final Answer:
if (head === null || head.next === null) return head; -> Option DQuick Check:
Base case = empty or single node [OK]
- Returning null when only one node exists
- Accessing head.next without checking if head is null
- Incorrectly returning head.next or head.next.next
function reverseList(head: ListNode | null): ListNode | null {
if (!head || !head.next) return head;
const newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}Solution
Step 1: Trace recursion on list 1 -> 2 -> 3
Recursion goes to node 3 (base case), then reverses links back: 3 points to 2, 2 points to 1.Step 2: Update pointers to reverse list
head.next.next = head sets 2's next to 1, head.next = null breaks old link, final reversed list is 3 -> 2 -> 1 -> null.Final Answer:
3 -> 2 -> 1 -> null -> Option AQuick Check:
Reversed list = 3 -> 2 -> 1 [OK]
- Not setting head.next to null causing cycles
- Returning original head instead of new head
- Confusing node values with pointers
function reverseList(head: ListNode | null): ListNode | null {
if (!head) return null;
if (!head.next) return head;
const newHead = reverseList(head.next);
head.next = null;
head.next.next = head;
return newHead;
}Solution
Step 1: Analyze pointer assignments order
Setting head.next = null before head.next.next = head breaks the chain because head.next becomes null.Step 2: Correct order to fix pointers
First set head.next.next = head to reverse link, then set head.next = null to break old link.Final Answer:
Swap the last two pointer assignments: set head.next.next before head.next = null -> Option BQuick Check:
Fix pointer order to avoid null errors [OK]
- Nullifying head.next too early
- Ignoring base cases
- Returning wrong node
function reverseList(head: ListNode | null): ListNode | null {
if (!head || !head.next) return head;
const newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
What will be the final linked list after calling reverseList on the head node with value 10?Solution
Step 1: Understand recursive reversal on list [10,20,30,40,50]
The recursion reaches the last node (50), then reverses links step-by-step back to the first node.Step 2: Trace pointer changes during recursion unwind
Each node's next node points back to it, and its next pointer is set to null, resulting in reversed list 50 -> 40 -> 30 -> 20 -> 10 -> null.Final Answer:
50 -> 40 -> 30 -> 20 -> 10 -> null -> Option AQuick Check:
Recursive reverse flips list order [OK]
- Expecting original order after reversal
- Not setting head.next to null causing cycles
- Confusing node values with pointers
Ready to prove it?
Pass the test and this pattern moves unknown
