📖 Scenario: You are managing a playlist of songs where each song is linked to the previous and next songs. Sometimes, you want to remove the first song from the playlist.
🎯 Goal: Build a doubly linked list of songs and write code to delete the first song from the list.
📋 What You'll Learn
Create a doubly linked list with exactly three nodes containing the song names: "Song1", "Song2", and "Song3" in that order.
Create a variable called head that points to the first node.
Write code to delete the first node from the doubly linked list by updating head and the links.
Print the list from head to the end showing the song names separated by -> and ending with null.
💡 Why This Matters
🌍 Real World
Doubly linked lists are used in music players, browsers, and other apps to move forward and backward through items efficiently.
💼 Career
Understanding linked lists helps in software development roles that involve data structure manipulation and memory management.
Progress0 / 4 steps
1
Create the doubly linked list with three nodes
Create a struct type called Node with fields data string, prev *Node, and next *Node. Then create three nodes with data values "Song1", "Song2", and "Song3". Link them so that node1.next = &node2, node2.prev = &node1, node2.next = &node3, and node3.prev = &node2. Finally, create a variable head that points to &node1.
DSA Go
Hint
Define the Node struct first. Then create three nodes and link their prev and next pointers correctly. Finally, set head to point to the first node.
2
Create a variable to hold the new head after deletion
Create a variable called newHead and set it to head.next.
DSA Go
Hint
Assign newHead to the node after head to prepare for deletion.
3
Update links to delete the first node
Set newHead.prev to nil to remove the backward link to the old head. Then set head to newHead.
DSA Go
Hint
Break the backward link from the new head to the old head by setting newHead.prev to nil. Then move head to point to newHead.
4
Print the doubly linked list from head
Use a for loop with a variable current starting at head. In each iteration, print current.data followed by -> . Move current to current.next. Stop when current is nil. After the loop, print null.
DSA Go
Hint
Start from head and print each node's data followed by -> . Stop when you reach the end and print null.
Practice
(1/5)
1. What happens to the head pointer when you delete the first node from a doubly linked list?
easy
A. It moves to the second node in the list
B. It becomes null immediately
C. It points to the last node
D. It remains unchanged
Solution
Step 1: Understand the head pointer role
The head pointer always points to the first node in the list.
Step 2: Effect of deleting the first node
When the first node is deleted, the head pointer must move to the next node, which becomes the new first node.
Final Answer:
It moves to the second node in the list -> Option A
Quick Check:
Head points to new first node after deletion [OK]
Hint: Head always points to the first node [OK]
Common Mistakes:
Thinking head becomes null without checking list emptiness
Assuming head points to last node after deletion
Not updating head pointer after deletion
2. Which of the following Go code snippets correctly deletes the first node from a doubly linked list named dll?
easy
A. dll.head.prev = nil; dll.head = dll.head.next
B. dll.head = dll.head.next; if dll.head != nil { dll.head.prev = nil }
C. dll.head.next.prev = nil; dll.head = dll.head.next
D. dll.head = nil; dll.tail = nil
Solution
Step 1: Move head to next node
Set dll.head = dll.head.next to remove first node reference.
Step 2: Update new head's prev pointer
If new head exists, set dll.head.prev = nil to detach backward link.
Final Answer:
dll.head = dll.head.next; if dll.head != nil { dll.head.prev = nil } -> Option B
Quick Check:
Correct pointer updates for deletion [OK]
Hint: Update head then clear new head's prev [OK]
Common Mistakes:
Setting prev pointer before moving head
Not checking if new head is nil
Clearing head and tail without condition
3. Given the following doubly linked list with nodes 10 <-> 20 <-> 30, what will be the list after deleting the first node?
type Node struct {
data int
prev *Node
next *Node
}
head := &Node{data: 10}
second := &Node{data: 20}
third := &Node{data: 30}
head.next = second
second.prev = head
second.next = third
third.prev = second
// Delete from beginning
head = head.next
head.prev = nil
// Print list
curr := head
for curr != nil {
fmt.Print(curr.data)
if curr.next != nil {
fmt.Print(" <-> ")
}
curr = curr.next
}
medium
A. 20 <-> 30
B. 10 <-> 20 <-> 30
C. 30
D. nil
Solution
Step 1: Initial list setup
List is 10 <-> 20 <-> 30 with head at 10.
Step 2: Delete first node
Head moves to 20, and 20's prev is set to nil, detaching 10.
Final Answer:
20 <-> 30 -> Option A
Quick Check:
First node removed, list starts at 20 [OK]
Hint: Head moves to next, prev cleared [OK]
Common Mistakes:
Not clearing prev pointer of new head
Printing old head node
Confusing next and prev pointers
4. Identify the error in this Go code snippet that tries to delete the first node from a doubly linked list:
A. It should assign dll.head.prev to dll.head.next
B. It should set dll.head.next.prev to nil instead
C. No error, code is correct
D. It does not check if dll.head.next is nil before accessing prev
Solution
Step 1: Check condition before accessing pointers
The code moves head to next node without checking if next node exists.
Step 2: Accessing prev of nil causes runtime error
If dll.head.next is nil, then dll.head becomes nil and accessing dll.head.prev causes panic.
Final Answer:
It does not check if dll.head.next is nil before accessing prev -> Option D
Quick Check:
Always check for nil before pointer access [OK]
Hint: Check nil before accessing pointers [OK]
Common Mistakes:
Assuming next node always exists
Not handling empty list after deletion
Confusing prev and next pointers
5. You have a doubly linked list with nodes 5 <-> 15. You want to delete the first node and then insert a new node with value 10 at the beginning. Which sequence of operations correctly updates the list?
hard
A. Delete first node by moving head to next; create new node with prev = head, next = nil; set head.next to new node
B. Delete first node by setting head to nil; create new node with next = nil, prev = nil; set head to new node
C. Delete first node by moving head to next and clearing prev; then create new node with next = head, prev = nil; update head.prev to new node; finally set head to new node
D. Delete first node by moving head to next; create new node with next = nil, prev = nil; set head to new node
Solution
Step 1: Delete first node properly
Move head to next node and set new head's prev to nil to detach old first node.
Step 2: Insert new node at beginning
Create new node with next pointing to current head and prev nil; update current head's prev to new node; update head pointer to new node.
Final Answer:
Delete first node by moving head to next and clearing prev; then create new node with next = head, prev = nil; update head.prev to new node; finally set head to new node -> Option C
Quick Check:
Proper delete then insert at head [OK]
Hint: Delete then insert by updating head and pointers [OK]
Common Mistakes:
Not updating prev pointer of old head after insertion
Setting new node's prev incorrectly
Overwriting head without linking new node
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.