📖 Scenario: Imagine you have a list of tasks to do today. Sometimes, you finish a task and want to remove it from your list. We will create a simple list of tasks and learn how to remove a task by its name.
🎯 Goal: You will build a singly linked list of tasks and write code to delete a task by its name (value). Finally, you will print the list after deletion to see the updated tasks.
📋 What You'll Learn
Create a singly linked list with exact tasks: "Laundry", "Groceries", "Homework", "Exercise"
Create a variable called taskToDelete with the value "Homework"
Write a function deleteNodeByValue that deletes the first node with the value equal to taskToDelete
Print the linked list after deletion in the format: Task1 -> Task2 -> ... -> nil
💡 Why This Matters
🌍 Real World
Linked lists are used in many applications like task scheduling, undo functionality in editors, and managing playlists where items can be added or removed dynamically.
💼 Career
Understanding linked lists and how to manipulate them is fundamental for software developers, especially when working with low-level data structures or optimizing memory usage.
Progress0 / 4 steps
1
Create the initial linked list
Create a singly linked list with nodes containing these exact tasks in order: "Laundry", "Groceries", "Homework", "Exercise". Use a struct called Node with fields task string and next *Node. Create a variable head pointing to the first node.
DSA Go
Hint
Start by defining the Node struct with task and next. Then create nodes linked together with the exact tasks.
2
Add the task to delete variable
Create a variable called taskToDelete and set it to the string "Homework".
DSA Go
Hint
Just create a string variable named taskToDelete and assign it the value "Homework".
3
Write the deleteNodeByValue function
Write a function called deleteNodeByValue that takes head *Node and value string as parameters and returns the new head *Node. It should delete the first node whose task equals value. Use this function in main to delete the node with taskToDelete.
DSA Go
Hint
Check if the head node has the value to delete. If yes, return the next node as new head. Otherwise, loop through nodes to find and remove the matching node.
4
Print the linked list after deletion
Write code to print the linked list starting from head in this exact format: Task1 -> Task2 -> ... -> nil. Use a for loop with a variable current to traverse the list.
DSA Go
Hint
Use a for loop with a variable current starting at head. Print each task followed by ->. End with nil.
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
Step 1: Understand the operation's goal
The operation aims to remove a node that matches a specific value from the linked list.
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.
Final Answer:
To remove the first node that contains the given value from the list -> Option B
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
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.
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.
Final Answer:
Option A code correctly deletes the first node with value 5 -> Option A
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
Step 1: Identify the first node with value 5
The first 5 appears as the third node in the list (1 -> 3 -> 5).
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.
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
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.
Step 2: Confirm no panic cause
The loop condition curr.next != nil prevents nil pointer dereference, so no panic from accessing curr.next.val.
Final Answer:
It does not handle deletion if the head node contains the value -> Option A
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
Step 1: Understand single pass deletion removes only first matching node
Each call deletes only the first node with value 4 found.
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.
Final Answer:
Call twice; final list: 2 -> 6 -> 8 -> null -> Option C
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 unknownstrongwhile earning +1 Grip toward your certificate.