Challenge - 5 Problems
Doubly Linked List Deletion Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediateOutput after deleting last node from doubly linked list
What is the printed state of the doubly linked list after deleting the last node?
DSA Go
package main import "fmt" type Node struct { data int prev *Node next *Node } type DoublyLinkedList struct { head *Node } func (dll *DoublyLinkedList) append(data int) { newNode := &Node{data: data} if dll.head == nil { dll.head = newNode return } temp := dll.head for temp.next != nil { temp = temp.next } temp.next = newNode newNode.prev = temp } func (dll *DoublyLinkedList) deleteFromEnd() { if dll.head == nil { return } if dll.head.next == nil { dll.head = nil return } temp := dll.head for temp.next != nil { temp = temp.next } temp.prev.next = nil } func (dll *DoublyLinkedList) printList() { if dll.head == nil { fmt.Println("null") return } temp := dll.head for temp != nil { fmt.Printf("%d", temp.data) if temp.next != nil { fmt.Printf(" -> ") } temp = temp.next } fmt.Println(" -> null") } func main() { dll := DoublyLinkedList{} dll.append(1) dll.append(2) dll.append(3) dll.deleteFromEnd() dll.printList() }
Attempts:
2 left
💡 Hint
Deleting from end removes the last node and updates the previous node's next pointer.
✗ Incorrect
The list initially is 1 -> 2 -> 3 -> null. After deleting the last node (3), the list becomes 1 -> 2 -> null.
❓ Predict Output
intermediateOutput after deleting last node from single-node doubly linked list
What is the printed state of the doubly linked list after deleting the last node when the list has only one node?
DSA Go
package main import "fmt" type Node struct { data int prev *Node next *Node } type DoublyLinkedList struct { head *Node } func (dll *DoublyLinkedList) append(data int) { newNode := &Node{data: data} if dll.head == nil { dll.head = newNode return } temp := dll.head for temp.next != nil { temp = temp.next } temp.next = newNode newNode.prev = temp } func (dll *DoublyLinkedList) deleteFromEnd() { if dll.head == nil { return } if dll.head.next == nil { dll.head = nil return } temp := dll.head for temp.next != nil { temp = temp.next } temp.prev.next = nil } func (dll *DoublyLinkedList) printList() { if dll.head == nil { fmt.Println("null") return } temp := dll.head for temp != nil { fmt.Printf("%d", temp.data) if temp.next != nil { fmt.Printf(" -> ") } temp = temp.next } fmt.Println(" -> null") } func main() { dll := DoublyLinkedList{} dll.append(10) dll.deleteFromEnd() dll.printList() }
Attempts:
2 left
💡 Hint
Deleting the only node should leave the list empty.
✗ Incorrect
When the list has only one node, deleting from end sets the head to nil, resulting in an empty list printed as null.
🔧 Debug
advancedIdentify the error in deleteFromEnd method
What error will this code produce when deleting from an empty doubly linked list?
DSA Go
func (dll *DoublyLinkedList) deleteFromEnd() {
temp := dll.head
for temp.next != nil {
temp = temp.next
}
temp.prev.next = nil
}Attempts:
2 left
💡 Hint
Check what happens if dll.head is nil before accessing temp.next.
✗ Incorrect
If dll.head is nil, temp is nil. Accessing temp.next causes a nil pointer dereference runtime error.
❓ Predict Output
advancedOutput after multiple deletions from end
What is the printed state of the doubly linked list after deleting from end twice?
DSA Go
package main import "fmt" type Node struct { data int prev *Node next *Node } type DoublyLinkedList struct { head *Node } func (dll *DoublyLinkedList) append(data int) { newNode := &Node{data: data} if dll.head == nil { dll.head = newNode return } temp := dll.head for temp.next != nil { temp = temp.next } temp.next = newNode newNode.prev = temp } func (dll *DoublyLinkedList) deleteFromEnd() { if dll.head == nil { return } if dll.head.next == nil { dll.head = nil return } temp := dll.head for temp.next != nil { temp = temp.next } temp.prev.next = nil } func (dll *DoublyLinkedList) printList() { if dll.head == nil { fmt.Println("null") return } temp := dll.head for temp != nil { fmt.Printf("%d", temp.data) if temp.next != nil { fmt.Printf(" -> ") } temp = temp.next } fmt.Println(" -> null") } func main() { dll := DoublyLinkedList{} dll.append(5) dll.append(10) dll.append(15) dll.deleteFromEnd() dll.deleteFromEnd() dll.printList() }
Attempts:
2 left
💡 Hint
Each deleteFromEnd removes the last node, so two deletions remove 15 and then 10.
✗ Incorrect
Starting list: 5 -> 10 -> 15 -> null. After first deletion: 5 -> 10 -> null. After second deletion: 5 -> null.
🧠 Conceptual
expertWhy is prev pointer important in deleteFromEnd for doubly linked list?
Which statement best explains why the prev pointer is used when deleting the last node in a doubly linked list?
Attempts:
2 left
💡 Hint
Think about how to remove the last node without losing the rest of the list.
✗ Incorrect
The prev pointer allows access to the node before the last node so its next pointer can be set to nil, removing the last node cleanly.
