Bird
Raised Fist0
DSA Typescriptprogramming~10 mins

Reverse a Singly Linked List Recursive in DSA Typescript - Execution Trace

Choose your learning style10 modes available
Concept Flow - Reverse a Singly Linked List Recursive
Start with head node
↓
Check if node is null or last
Yes↓
Return node as new head
No↓
Recursive call on next node
↓
Reverse link: next.next = current
↓
Set current.next = null
↓
Return new head from recursion
The function calls itself on the next node until it reaches the last node, then reverses the links on the way back.
Execution Sample
DSA Typescript
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;
}
This code reverses a singly linked list by recursively reversing the rest of the list and then fixing the current node's next pointer.
Execution Table
StepOperationCurrent NodeRecursive Call ResultPointer ChangesVisual State
1Call reverseList(head=1)1Calls reverseList(2)None yet1 -> 2 -> 3 -> null
2Call reverseList(head=2)2Calls reverseList(3)None yet1 -> 2 -> 3 -> null
3Call reverseList(head=3)3Base case reached, returns 3None1 -> 2 -> 3 -> null
4Reverse link at node 22newHead=32.next.next = 2; 2.next = null1 -> 2 <- 3 (3.next=2, 2.next=null)
5Reverse link at node 11newHead=31.next.next = 1; 1.next = null1 <- 2 <- 3 (3.next=2, 2.next=1, 1.next=null)
6Return newHead=3null3No change3 -> 2 -> 1 -> null
💡 Recursion ends when head is last node (3), then links reversed on return steps.
Variable Tracker
VariableStartAfter Step 3After Step 4After Step 5Final
head13 (in deepest call)21null
newHeadundefined3333
Pointer ChangesNoneNone2.next.next=2; 2.next=null1.next.next=1; 1.next=nullNo change
Key Moments - 3 Insights
Why do we set head.next = null after reversing the link?
Because after reversing, the original next node points back to current node, so current node's next must be null to avoid cycles. See step 4 and 5 in execution_table.
Why does the recursion stop at the last node?
The base case returns the last node as new head without further calls, as shown in step 3 of execution_table.
How does the recursive call return the new head to the previous calls?
Each recursive call returns the new head from the deepest call, passing it back up the call stack, as shown in Recursive Call Result column.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the Visual State after step 4?
A1 -> 2 -> 3 -> null
B1 -> 2 <- 3 (3.next=2, 2.next=null)
C3 -> 2 -> 1 -> null
D1 <- 2 <- 3 (3.next=2, 2.next=1, 1.next=null)
💡 Hint
Check the Visual State column at step 4 in execution_table.
At which step does the recursion reach the base case?
AStep 3
BStep 1
CStep 2
DStep 5
💡 Hint
Look at the Operation and Recursive Call Result columns in execution_table.
If we remove 'head.next = null' line, what would happen to the final list?
AList becomes empty
BList remains correctly reversed
CList forms a cycle causing infinite loop
DOnly first two nodes are reversed
💡 Hint
Refer to key_moments about why head.next is set to null after reversing.
Concept Snapshot
Reverse a singly linked list recursively:
- Base case: if node is null or last, return node
- Recursive call on next node
- Reverse link: next.next = current node
- Set current.next = null to avoid cycle
- Return new head from recursion
Full Transcript
This visualization shows how to reverse a singly linked list using recursion. The function calls itself until it reaches the last node, which becomes the new head. On returning, it reverses the links by making the next node point back to the current node and setting current node's next to null to avoid cycles. The new head is passed back through all recursive calls. The execution table tracks each step, pointer changes, and the visual state of the list. Key moments clarify why setting next to null is necessary and how recursion unwinds. The quiz tests understanding of these steps.

Practice

(1/5)
1. What is the main idea behind reversing a singly linked list using recursion?
easy
A. Create a new list and copy nodes in reverse order
B. Swap the values of the first and last nodes only
C. Reverse the rest of the list first, then fix the current node's next pointer
D. Iterate through the list and reverse pointers using a loop

Solution

  1. 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.
  2. 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.
  3. Final Answer:

    Reverse the rest of the list first, then fix the current node's next pointer -> Option C
  4. Quick Check:

    Recursive reversal = reverse rest + fix pointer [OK]
Hint: Think: reverse smaller list first, then fix current link [OK]
Common Mistakes:
  • Trying to swap node values instead of pointers
  • Not fixing the current node's next pointer after recursion
  • Using iteration instead of recursion
2. Which of the following is the correct base case for a recursive function that reverses a singly linked list?
easy
A. if (head === null) return head.next;
B. if (head.next === null) return null;
C. if (head === null) return head.next.next;
D. if (head === null || head.next === null) return head;

Solution

  1. 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.
  2. 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.
  3. Final Answer:

    if (head === null || head.next === null) return head; -> Option D
  4. Quick Check:

    Base case = empty or single node [OK]
Hint: Base case: empty or single node returns itself [OK]
Common Mistakes:
  • Returning null when only one node exists
  • Accessing head.next without checking if head is null
  • Incorrectly returning head.next or head.next.next
3. What will be the output linked list after running this recursive reverse function on the list 1 -> 2 -> 3 -> null?
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;
}
medium
A. 3 -> 2 -> 1 -> null
B. 1 -> 2 -> 3 -> null
C. null
D. 2 -> 3 -> 1 -> null

Solution

  1. 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.
  2. 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.
  3. Final Answer:

    3 -> 2 -> 1 -> null -> Option A
  4. Quick Check:

    Reversed list = 3 -> 2 -> 1 [OK]
Hint: Last node becomes new head after recursion [OK]
Common Mistakes:
  • Not setting head.next to null causing cycles
  • Returning original head instead of new head
  • Confusing node values with pointers
4. Identify the bug in this recursive reverse function and choose the fix:
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;
}
medium
A. Remove the base case for head.next === null
B. Swap the last two pointer assignments: set head.next.next before head.next = null
C. Return head instead of newHead
D. Add a loop to reverse pointers instead of recursion

Solution

  1. Step 1: Analyze pointer assignments order

    Setting head.next = null before head.next.next = head breaks the chain because head.next becomes null.
  2. 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.
  3. Final Answer:

    Swap the last two pointer assignments: set head.next.next before head.next = null -> Option B
  4. Quick Check:

    Fix pointer order to avoid null errors [OK]
Hint: Set head.next.next before nullifying head.next [OK]
Common Mistakes:
  • Nullifying head.next too early
  • Ignoring base cases
  • Returning wrong node
5. Given a singly linked list with nodes containing values [10, 20, 30, 40, 50], which recursive approach correctly reverses the list and returns the new head?
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?
hard
A. 50 -> 40 -> 30 -> 20 -> 10 -> null
B. 10 -> 20 -> 30 -> 40 -> 50 -> null
C. null
D. 20 -> 30 -> 40 -> 50 -> 10 -> null

Solution

  1. 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.
  2. 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.
  3. Final Answer:

    50 -> 40 -> 30 -> 20 -> 10 -> null -> Option A
  4. Quick Check:

    Recursive reverse flips list order [OK]
Hint: Last node becomes new head, links reversed back [OK]
Common Mistakes:
  • Expecting original order after reversal
  • Not setting head.next to null causing cycles
  • Confusing node values with pointers
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard