What if removing the last item could be done in just a few steps without breaking everything?
Why Delete Node at End in DSA Go?
Imagine you have a long paper chain made of connected loops. You want to remove the last loop without breaking the whole chain.
If you try to remove the last loop by guessing or pulling randomly, you might break the chain or spend a lot of time finding the right loop to remove.
Using the 'Delete Node at End' method, you can carefully find the second last loop and remove the last one safely and quickly, keeping the chain intact.
for i := 0; i < len(chain)-1; i++ { // find second last loop } removeLastLoop()
func deleteAtEnd(head *Node) *Node {
if head == nil {
return nil
}
if head.next == nil {
return nil
}
current := head
for current.next.next != nil {
current = current.next
}
current.next = nil
return head
}This lets you quickly and safely remove the last item from a list without breaking the rest.
Think about a music playlist where you want to remove the last song added without disturbing the order of other songs.
Manually removing the last item can be slow and risky.
Deleting the node at the end uses a simple, safe method to find and remove the last item.
This keeps the list structure intact and easy to manage.
Practice
Delete Node at End do in a 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 AQuick Check:
Delete Node at End = Remove last node [OK]
- Confusing delete at end with delete at start
- Thinking it adds a node instead of removing
- Assuming it deletes all nodes
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 AQuick Check:
Traverse to second last node, set next to nil [OK]
- Setting head to nil incorrectly
- Not stopping at second last node
- Trying to delete node by setting local pointer nil
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")
}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 CQuick Check:
Last node removed, list ends at 2 [OK]
- Forgetting to update next pointer to nil
- Deleting first node instead of last
- Printing old list without deletion
func deleteEnd(head *Node) *Node {
if head == nil { return nil }
curr := head
for curr.next != nil {
curr = curr.next
}
curr = nil
return head
}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 DQuick Check:
Must update second last node's next to nil [OK]
- Setting local pointer nil instead of previous node's next
- Not handling single node list
- Assuming curr = nil deletes node
deleteEnd function to handle the edge case when the list has only one 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 BQuick Check:
Single node deletion returns empty list [OK]
- Not handling single node case causing errors
- Setting head.next to nil but returning non-empty list
- Unnecessary extra traversal
Ready to prove it?
Pass the test and this pattern moves unknown
