📖 Scenario: You are managing a playlist of songs where each song is linked to the previous and next songs. You want to insert a new song at a specific position in the playlist.
🎯 Goal: Build a doubly linked list of songs and insert a new song at a given position.
📋 What You'll Learn
Create a doubly linked list with three songs: "Song1", "Song2", "Song3"
Create a variable position with value 2 to specify where to insert
Insert a new song "NewSong" at the position in the doubly linked list
Print the doubly linked list from head to tail showing song names separated by -> and ending with null
💡 Why This Matters
🌍 Real World
Doubly linked lists are used in music players, web browsers, and undo-redo features where you need to move forward and backward easily.
💼 Career
Understanding linked lists and insertion operations is fundamental for software engineers working with data structures, memory management, and performance optimization.
Progress0 / 4 steps
1
Create the initial doubly linked list
Create a doubly linked list with nodes containing "Song1", "Song2", and "Song3" in that order. Use a struct called Node with fields data (string), prev (*Node), and next (*Node). Create a variable head pointing to the first node.
DSA Go
Hint
Define the Node struct first. Then create three nodes and link them using prev and next.
2
Set the insertion position
Create an integer variable called position and set it to 2. This will be the position where the new song will be inserted.
DSA Go
Hint
Just create a variable position and assign it the value 2.
3
Insert the new song at the specified position
Create a new node with data "NewSong". Insert this node at the position in the doubly linked list. Update the prev and next pointers of the surrounding nodes accordingly.
DSA Go
Hint
Traverse the list to the node before the insertion position. Then adjust pointers to insert the new node.
4
Print the doubly linked list
Print the doubly linked list from head to the end. Show the data of each node separated by -> and end with null. For example: Song1 -> Song2 -> NewSong -> Song3 -> null
DSA Go
Hint
Use a loop to move from head to the end, printing each node's data followed by -> . After the loop, print null.
Practice
(1/5)
1. What does inserting a node at a specific position in a doubly linked list involve?
easy
A. Only changing the head pointer of the list
B. Adjusting the previous and next pointers of neighboring nodes to include the new node
C. Replacing the node at that position without changing pointers
D. Appending the node at the end regardless of position
Solution
Step 1: Understand doubly linked list structure
Each node has pointers to both previous and next nodes, so insertion requires updating these pointers.
Step 2: Insert node at specific position
To insert, update the previous node's next pointer and the next node's previous pointer to point to the new node.
Final Answer:
Adjusting the previous and next pointers of neighboring nodes to include the new node -> Option B
Quick Check:
Pointer updates = A [OK]
Hint: Remember both previous and next pointers must be updated [OK]
Common Mistakes:
Only updating one pointer and ignoring the other
Not handling edge cases like insertion at head or tail
Replacing node data instead of inserting new node
2. Which of the following Go code snippets correctly declares a doubly linked list node struct for insertion?
easy
A. type Node struct { data int; prev *Node; next *Node }
B. type Node struct { data int; next *Node }
C. type Node struct { data int; prev int; next int }
D. type Node struct { data int; prev Node; next Node }
Solution
Step 1: Check struct fields for doubly linked list
A doubly linked list node must have pointers to previous and next nodes, both of type *Node.
Step 2: Validate Go syntax
type Node struct { data int; prev *Node; next *Node } correctly uses pointers (*Node) for prev and next fields, matching doubly linked list requirements.
Final Answer:
type Node struct { data int; prev *Node; next *Node } -> Option A
Quick Check:
Pointers for prev and next = A [OK]
Hint: Use *Node type for prev and next pointers in struct [OK]
Common Mistakes:
Using non-pointer types for prev and next
Omitting prev pointer for doubly linked list
Using incorrect field types like int for pointers
3. What will be the output of the doubly linked list after inserting a node with value 25 at position 3 in the list 10 <-> 20 <-> 30 <-> 40?
medium
A. 10 <-> 20 <-> 25 <-> 30 <-> 40
B. 10 <-> 25 <-> 20 <-> 30 <-> 40
C. 25 <-> 10 <-> 20 <-> 30 <-> 40
D. 10 <-> 20 <-> 30 <-> 40 <-> 25
Solution
Step 1: Identify position 3 in the list
Positions: 1=10, 2=20, 3=30, 4=40. Inserting at position 3 means before node with value 30.
Step 2: Insert node with value 25 at position 3
New node 25 goes between 20 and 30, updating pointers accordingly.
Final Answer:
10 <-> 20 <-> 25 <-> 30 <-> 40 -> Option A
Quick Check:
Insert before 3rd node = D [OK]
Hint: Insert before node currently at that position [OK]
Common Mistakes:
Inserting after the node at position instead of before
Appending at end instead of correct position
Confusing position indexing starting at 0
4. Given the following Go code snippet for insertion, what is the error?
func InsertAtPosition(head *Node, data int, pos int) *Node {
newNode := &Node{data: data}
if pos == 1 {
newNode.next = head
head.prev = newNode
head = newNode
return head
}
temp := head
for i := 1; i < pos-1; i++ {
temp = temp.next
}
newNode.next = temp.next
temp.next.prev = newNode
temp.next = newNode
newNode.prev = temp
return head
}
medium
A. Incorrect assignment of newNode.prev
B. Missing creation of newNode
C. No check if temp or temp.next is nil before accessing pointers
D. Returning newNode instead of head
Solution
Step 1: Analyze pointer usage in loop and insertion
The loop moves temp to position before insertion. If pos is beyond list length, temp or temp.next can be nil.
Step 2: Identify missing nil checks
Accessing temp.next.prev without checking if temp.next is nil can cause runtime panic.
Final Answer:
No check if temp or temp.next is nil before accessing pointers -> Option C
Quick Check:
Missing nil checks cause runtime errors [OK]
Hint: Always check for nil before accessing next or prev pointers [OK]
Common Mistakes:
Ignoring nil pointer checks causing crashes
Incorrect pointer assignments order
Returning wrong node pointer
5. You have a doubly linked list: 5 <-> 15 <-> 25 <-> 35. You want to insert a node with value 20 at position 3. After insertion, what will be the correct order of nodes and how should pointers be updated?
hard
A. 5 <-> 20 <-> 15 <-> 25 <-> 35; update 5.next to 20, 20.prev to 5, 20.next to 15, 15.prev to 20
B. 5 <-> 15 <-> 25 <-> 20 <-> 35; update 25.next to 20, 20.prev to 25, 20.next to 35, 35.prev to 20
C. 20 <-> 5 <-> 15 <-> 25 <-> 35; update head to 20, 20.next to 5, 5.prev to 20
D. 5 <-> 15 <-> 20 <-> 25 <-> 35; update 15.next to 20, 20.prev to 15, 20.next to 25, 25.prev to 20
Solution
Step 1: Determine correct insertion position
Position 3 means node with value 20 goes between nodes 15 (pos 2) and 25 (pos 3).
Step 2: Update pointers for insertion
Set 15.next to new node 20, 20.prev to 15, 20.next to 25, and 25.prev to 20 to maintain list integrity.
Final Answer:
5 <-> 15 <-> 20 <-> 25 <-> 35; update 15.next to 20, 20.prev to 15, 20.next to 25, 25.prev to 20 -> Option D
Quick Check:
Insert between 15 and 25 with pointer updates = C [OK]
Hint: Insert between nodes and update four pointers correctly [OK]
Common Mistakes:
Swapping nodes or inserting at wrong position
Forgetting to update prev pointers
Incorrectly updating next pointers causing broken links
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.