📖 Scenario: Imagine you are managing a line of people waiting to buy tickets. Sometimes, the last person in line leaves. You want to update the line to reflect this change.
🎯 Goal: You will create a singly linked list, then write code to remove the last person (node) from the list, and finally print the updated list.
📋 What You'll Learn
Create a singly linked list with exactly three nodes containing values 10, 20, and 30 in that order
Create a function called deleteAtEnd that removes the last node from the linked list
Print the linked list after deleting the last node in the format: 10 -> 20 -> null
💡 Why This Matters
🌍 Real World
Linked lists are used in many applications like managing playlists, undo functionality in software, and real-time data processing where elements are frequently added or removed.
💼 Career
Understanding linked list operations like deletion is fundamental for software developers, especially when working with low-level data structures or optimizing memory usage.
Progress0 / 4 steps
1
Create the singly linked list with three nodes
Create a singly linked list by defining a Node struct with an int field called data and a pointer to the next node called next. Then create three nodes with values 10, 20, and 30 linked in that order. Assign the first node to a variable called head.
DSA Go
Hint
Start by defining the Node struct. Then create three nodes and link them by setting the next pointers.
2
Create the deleteAtEnd function
Create a function called deleteAtEnd that takes a pointer to the head node of the linked list and returns the updated head pointer after removing the last node. Handle the case when the list is empty or has only one node.
DSA Go
Hint
Check if the list is empty or has one node. Then loop to find the second last node and set its next to nil.
3
Call deleteAtEnd to remove the last node
In the main function, call deleteAtEnd with the head node and update head with the returned value.
DSA Go
Hint
Assign the result of deleteAtEnd(head) back to head to update the list.
4
Print the linked list after deletion
Write a printList function that takes the head node and prints the list nodes in the format: 10 -> 20 -> null. Call this function in main after deleting the last node.
DSA Go
Hint
Loop through the list printing each node's data followed by '->'. After the last node, print 'null'.
Practice
(1/5)
1. What does the operation Delete Node at End do in a linked list?
easy
A. Removes the last node from the linked list
B. Adds a new node at the end of the linked list
C. Removes the first node from the linked list
D. Deletes all nodes in the linked list
Solution
Step 1: Understand the linked list structure
A linked list is a chain of nodes where each node points to the next node.
Step 2: Identify the effect of deleting the last node
Deleting the last node means removing the node that has no next node, effectively shortening the list by one at the end.
Final Answer:
Removes the last node from the linked list -> Option A
Quick Check:
Delete Node at End = Remove last node [OK]
Hint: Deleting at end always removes the tail node [OK]
Common Mistakes:
Confusing delete at end with delete at start
Thinking it adds a node instead of removing
Assuming it deletes all nodes
2. Which of the following Go code snippets correctly deletes the last node of a singly linked list?
easy
A. func deleteEnd(head *Node) *Node { if head == nil || head.next == nil { return nil } curr := head; for curr.next.next != nil { curr = curr.next } curr.next = nil; return head }
B. func deleteEnd(head *Node) *Node { head = head.next; return head }
C. func deleteEnd(head *Node) *Node { head = nil; return head }
D. func deleteEnd(head *Node) *Node { curr := head; for curr.next != nil { curr = curr.next } curr = nil; return head }
Solution
Step 1: Check for empty or single node list
If list is empty or has one node, deleting last node results in empty list (return nil).
Step 2: Traverse to second last node and remove last
Loop until curr.next.next is nil, then set curr.next to nil to remove last node.
Final Answer:
Code in option A correctly deletes the last node -> Option A
Quick Check:
Traverse to second last node, set next to nil [OK]
Hint: Stop at second last node, then remove last [OK]
Common Mistakes:
Setting head to nil incorrectly
Not stopping at second last node
Trying to delete node by setting local pointer nil
3. What will be the output linked list after running this Go code to delete the last node?
type Node struct { val int; next *Node } func main() { head := &Node{val: 1, next: &Node{val: 2, next: &Node{val: 3, next: nil}}} head = deleteEnd(head) printList(head) } func deleteEnd(head *Node) *Node { if head == nil || head.next == nil { return nil } curr := head for curr.next.next != nil { curr = curr.next } curr.next = nil return head } func printList(head *Node) { for head != nil { fmt.Print(head.val, " -> ") head = head.next } fmt.Println("nil") }
medium
A. 2 -> 3 -> nil
B. 1 -> 2 -> 3 -> nil
C. 1 -> 2 -> nil
D. nil
Solution
Step 1: Understand initial list
List is 1 -> 2 -> 3 -> nil before deletion.
Step 2: Delete last node
deleteEnd removes node with value 3, so list becomes 1 -> 2 -> nil.
Final Answer:
1 -> 2 -> nil -> Option C
Quick Check:
Last node removed, list ends at 2 [OK]
Hint: Deleting end removes last value from printed list [OK]
Common Mistakes:
Forgetting to update next pointer to nil
Deleting first node instead of last
Printing old list without deletion
4. Find the bug in this Go function that tries to delete the last node of a singly linked list:
func deleteEnd(head *Node) *Node { if head == nil { return nil } curr := head for curr.next != nil { curr = curr.next } curr = nil return head }
medium
A. It does not handle empty list correctly
B. It causes a runtime panic due to nil pointer dereference
C. It deletes the entire list instead of last node
D. It does not update the second last node's next pointer
Solution
Step 1: Analyze the loop
The loop moves curr to the last node (where curr.next is nil).
Step 2: Check deletion logic
Setting curr = nil only changes local pointer, does not update previous node's next pointer, so last node remains linked.
Final Answer:
It does not update the second last node's next pointer -> Option D
Quick Check:
Must update second last node's next to nil [OK]
Hint: Update second last node's next, not local pointer [OK]
Common Mistakes:
Setting local pointer nil instead of previous node's next
Not handling single node list
Assuming curr = nil deletes node
5. Given a singly linked list, how would you modify the deleteEnd function to handle the edge case when the list has only one node?
hard
A. Do nothing and return head as is
B. Return nil immediately if head.next is nil, indicating list becomes empty
C. Set head.next to nil and return head
D. Traverse the list twice to confirm single node
Solution
Step 1: Identify single node case
If head.next is nil, list has only one node.
Step 2: Decide deletion result
Deleting last node means list becomes empty, so return nil.
Final Answer:
Return nil immediately if head.next is nil, indicating list becomes empty -> Option B
Quick Check:
Single node deletion returns empty list [OK]
Hint: Check if only one node, then return nil [OK]
Common Mistakes:
Not handling single node case causing errors
Setting head.next to nil but returning non-empty list
Unnecessary extra traversal
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.