Bird
Raised Fist0
DSA Goprogramming~10 mins

Delete Node by Value in DSA Go - Execution Trace

Choose your learning style10 modes available
Concept Flow - Delete Node by Value
Start at head
↓
Check if head is nil
↓
Exit
↓
Delete head
↓
Update head
↓
Delete next node
↓
Update links
↓
Exit
Start from the head node, check if it matches the value to delete. If yes, remove head. Otherwise, traverse nodes until the target is found, then remove it by updating links.
Execution Sample
DSA Go
func deleteNode(head *Node, val int) *Node {
  if head == nil {
    return nil
  }
  if head.value == val {
    return head.next
  }
  curr := head
  for curr.next != nil {
    if curr.next.value == val {
      curr.next = curr.next.next
      break
    }
    curr = curr.next
  }
  return head
}
Deletes the first node with the given value from a singly linked list and returns the updated head.
Execution Table
StepCurrent Node ValueConditionActionList State
11 (head)head == nil? NoCheck if head.value == 31 -> 2 -> 3 -> 4 -> null
21 (head)head.value == 3? NoSet curr = head1 -> 2 -> 3 -> 4 -> null
3curr = 1curr.next != nil? YesCheck if curr.next.value == 31 -> 2 -> 3 -> 4 -> null
4curr.next = 22 == 3? NoMove curr to curr.next1 -> 2 -> 3 -> 4 -> null
5curr = 2curr.next != nil? YesCheck if curr.next.value == 31 -> 2 -> 3 -> 4 -> null
6curr.next = 33 == 3? YesDelete curr.next by linking curr.next = curr.next.next1 -> 2 -> 4 -> null
7curr = 2Break loopReturn head1 -> 2 -> 4 -> null
8EndLoop endedReturn updated list1 -> 2 -> 4 -> null
💡 Node with value 3 found and deleted; loop breaks and updated list returned.
Variable Tracker
VariableStartAfter Step 2After Step 4After Step 6Final
head1 -> 2 -> 3 -> 4 -> null1 -> 2 -> 3 -> 4 -> null1 -> 2 -> 3 -> 4 -> null1 -> 2 -> 4 -> null1 -> 2 -> 4 -> null
currnil1222
Key Moments - 3 Insights
Why do we check if head.value == val before the loop?
Because the node to delete might be the first node (head). If we don't check this first, we might miss deleting the head and the list would remain unchanged. See execution_table step 1 and 2.
Why do we update curr.next instead of curr when deleting a node?
We update curr.next to skip the node to delete, effectively removing it from the list. Changing curr would just move the pointer, not remove the node. See execution_table step 6.
What happens if the value is not found in the list?
The loop runs until curr.next is nil without deleting any node, then returns the original list unchanged. See execution_table steps 3 to 8 for the loop and exit.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the list state after step 6?
A1 -> 2 -> 3 -> 4 -> null
B1 -> 2 -> 4 -> null
C2 -> 3 -> 4 -> null
D1 -> 3 -> 4 -> null
💡 Hint
Check the 'List State' column at step 6 in the execution_table.
At which step does the loop break after deleting the node?
AStep 4
BStep 5
CStep 6
DStep 7
💡 Hint
Look for the 'Break loop' action in the execution_table.
If the head node had value 3, what would happen at step 2?
AThe function would return head.next, deleting the head
BThe loop would start without deleting the head
CThe function would return nil immediately
DThe function would delete the last node
💡 Hint
See the condition and action at step 2 in the execution_table.
Concept Snapshot
Delete Node by Value in Singly Linked List:
- Check if list is empty (head == nil)
- If head.value == target, remove head by returning head.next
- Else, traverse list with curr pointer
- If curr.next.value == target, remove node by curr.next = curr.next.next
- Return updated head
- Stops after first deletion
Full Transcript
This visual execution traces deleting a node by value in a singly linked list. We start by checking if the list is empty. If not, we check if the head node has the target value. If yes, we remove the head by returning the next node. Otherwise, we traverse the list using a pointer called curr. For each node, we check if the next node has the target value. If found, we remove it by linking curr.next to curr.next.next, skipping the node to delete. We then break the loop and return the updated list head. If the value is not found, the list remains unchanged. The variable tracker shows how head and curr change during execution. Key moments clarify why we check head first, why we update curr.next, and what happens if the value is missing. The quiz tests understanding of list state changes, loop break points, and head deletion cases.

Practice

(1/5)
1. What is the main purpose of the Delete Node by Value operation in a linked list?
easy
A. To find the position of a node with the given value
B. To remove the first node that contains the given value from the list
C. To add a new node with the given value at the end of the list
D. To reverse the linked list

Solution

  1. Step 1: Understand the operation's goal

    The operation aims to remove a node that matches a specific value from the linked list.
  2. Step 2: Identify the correct description

    Removing the first node with the given value matches To remove the first node that contains the given value from the list, while others describe different operations.
  3. Final Answer:

    To remove the first node that contains the given value from the list -> Option B
  4. Quick Check:

    Delete node by value means remove matching node [OK]
Hint: Delete node by value means remove matching node [OK]
Common Mistakes:
  • Confusing deletion with insertion
  • Thinking it finds position instead of deleting
  • Assuming it reverses the list
2. Which of the following Go code snippets correctly deletes the first node with value 5 from a singly linked list starting at head?
easy
A. if head == nil { return head } if head.val == 5 { return head.next } curr := head for curr.next != nil && curr.next.val != 5 { curr = curr.next } if curr.next != nil { curr.next = curr.next.next } return head
B. if head == nil { return nil } curr := head for curr != nil && curr.val != 5 { curr = curr.next } if curr != nil { curr = curr.next } return head
C. if head.val == 5 { head = nil } curr := head for curr.next != nil { if curr.next.val == 5 { curr.next = nil } curr = curr.next } return head
D. curr := head for curr.next != nil { if curr.val == 5 { curr = curr.next.next } curr = curr.next } return head

Solution

  1. Step 1: Check for empty list and head node value

    if head == nil { return head } if head.val == 5 { return head.next } curr := head for curr.next != nil && curr.next.val != 5 { curr = curr.next } if curr.next != nil { curr.next = curr.next.next } return head correctly returns head.next if head's value is 5, handling deletion at the start.
  2. Step 2: Traverse and delete node with value 5

    if head == nil { return head } if head.val == 5 { return head.next } curr := head for curr.next != nil && curr.next.val != 5 { curr = curr.next } if curr.next != nil { curr.next = curr.next.next } return head uses a loop to find the node before the target and updates links properly; others miss this or incorrectly update pointers.
  3. Final Answer:

    Option A code correctly deletes the first node with value 5 -> Option A
  4. Quick Check:

    Proper pointer update and head check = if head == nil { return head } if head.val == 5 { return head.next } curr := head for curr.next != nil && curr.next.val != 5 { curr = curr.next } if curr.next != nil { curr.next = curr.next.next } return head [OK]
Hint: Check head value first, then update next pointers carefully [OK]
Common Mistakes:
  • Not handling deletion when head node matches
  • Incorrect pointer updates causing list break
  • Skipping traversal or deleting wrong node
3. Given the linked list: 1 -> 3 -> 5 -> 7 -> 5 -> null, what will be the list after deleting the first node with value 5 using the standard delete-by-value function?
medium
A. 1 -> 3 -> 5 -> 7 -> null
B. 1 -> 3 -> 7 -> null
C. 3 -> 5 -> 7 -> 5 -> null
D. 1 -> 3 -> 7 -> 5 -> null

Solution

  1. Step 1: Identify the first node with value 5

    The first 5 appears as the third node in the list (1 -> 3 -> 5).
  2. Step 2: Remove that node and link previous to next

    Deleting this node links 3 directly to 7, resulting in 1 -> 3 -> 7 -> 5 -> null.
  3. Final Answer:

    1 -> 3 -> 7 -> 5 -> null -> Option D
  4. Quick Check:

    First 5 removed, rest unchanged = 1 -> 3 -> 7 -> 5 -> null [OK]
Hint: Delete only first matching node, keep rest intact [OK]
Common Mistakes:
  • Deleting all nodes with value 5
  • Removing wrong node (second 5)
  • Breaking list links incorrectly
4. The following Go code attempts to delete a node by value from a singly linked list but causes a runtime panic. What is the error?
func deleteNode(head *Node, val int) *Node {
    curr := head
    for curr.next != nil {
        if curr.next.val == val {
            curr.next = curr.next.next
            break
        }
        curr = curr.next
    }
    return head
}
medium
A. It does not handle deletion if the head node contains the value
B. It causes infinite loop due to missing curr update
C. It tries to access curr.next.val without checking if curr.next is nil
D. It deletes all nodes with the value instead of just the first

Solution

  1. Step 1: Analyze head node deletion case

    The code starts from head and checks curr.next, so if head itself has the value, it is not deleted.
  2. Step 2: Confirm no panic cause

    The loop condition curr.next != nil prevents nil pointer dereference, so no panic from accessing curr.next.val.
  3. Final Answer:

    It does not handle deletion if the head node contains the value -> Option A
  4. Quick Check:

    Head node deletion missing = It does not handle deletion if the head node contains the value [OK]
Hint: Always check head node separately before looping [OK]
Common Mistakes:
  • Ignoring head node deletion
  • Assuming panic from nil pointer without checking
  • Not breaking after deletion causing multiple deletes
5. You have a singly linked list with nodes containing values: 2 -> 4 -> 6 -> 4 -> 8 -> null. You want to delete all nodes with value 4 using a single pass delete-by-value function that deletes only the first matching node per call. How many times must you call this function to remove all 4s, and what will the list look like after all deletions?
hard
A. Call twice; final list: 2 -> 4 -> 6 -> 8 -> null
B. Call once; final list: 2 -> 6 -> 4 -> 8 -> null
C. Call twice; final list: 2 -> 6 -> 8 -> null
D. Call once; final list: 2 -> 6 -> 8 -> null

Solution

  1. Step 1: Understand single pass deletion removes only first matching node

    Each call deletes only the first node with value 4 found.
  2. Step 2: Count calls needed and final list

    First call removes the first 4 (second node), list becomes 2 -> 6 -> 4 -> 8 -> null. Second call removes the next 4 (third node), list becomes 2 -> 6 -> 8 -> null.
  3. Final Answer:

    Call twice; final list: 2 -> 6 -> 8 -> null -> Option C
  4. Quick Check:

    Two calls remove both 4s = Call twice; final list: 2 -> 6 -> 8 -> null [OK]
Hint: One call deletes one node; repeat until all removed [OK]
Common Mistakes:
  • Assuming one call removes all matching nodes
  • Miscounting nodes deleted per call
  • Confusing node positions after deletions
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