What if you could add new items instantly at the start without moving everything else?
Why Insert at Beginning of Doubly Linked List in DSA Rust?
Imagine you have a paper list of names, and you want to add a new name at the top every time a new friend joins. Doing this by rewriting the whole list every time is tiring and slow.
Manually rewriting or shifting all names down to add one at the top takes a lot of time and can cause mistakes like skipping or duplicating names.
A doubly linked list lets you quickly add a new item at the start by just changing a few links, without moving the whole list. This saves time and avoids errors.
let mut list = vec!["Alice", "Bob", "Charlie"]; list.insert(0, "Zara");
let mut list = DoublyLinkedList::new();
list.insert_at_beginning("Zara");This lets you build and update lists efficiently, even when they grow large, without slowing down.
Think of a music playlist where the newest song always plays first. Adding songs at the start quickly keeps the playlist fresh.
Manual insertion at the start is slow and error-prone.
Doubly linked lists allow fast, safe insertion at the beginning.
This operation updates only a few links, saving time and effort.
Practice
Solution
Step 1: Understand the operation
Inserting at the beginning means adding a new node before the current first node.Step 2: Effect on head pointer
The head pointer must be updated to point to this new node, making it the first element.Final Answer:
To add a new node as the first element, updating head pointer -> Option CQuick Check:
Insert at beginning = update head to new node [OK]
- Confusing insertion at beginning with insertion at end
- Not updating the head pointer
- Not adjusting previous pointer of old head
Solution
Step 1: Create new node with prev None and next as current head
The new node's previous pointer should be None because it will be the first node. Its next pointer should point to the current head.Step 2: Update head to new node
After creating the new node, the head pointer must be updated to point to this new node.Final Answer:
let new_node = Box::new(Node { data: val, prev: None, next: head }); head = Some(new_node); -> Option AQuick Check:
New node prev None, next head, update head [OK]
- Setting prev to head instead of None
- Not boxing the new node
- Updating tail instead of head
struct Node {
data: i32,
prev: Option,
next: Option,
}
let mut head = Some(Box::new(Node { data: 2, prev: None, next: None }));
// Insert 1 at beginning
let new_node = Box::new(Node { data: 1, prev: None, next: head });
head = Some(new_node);
// Print list
let mut current = &head;
while let Some(node) = current {
print!("{} -> ", node.data);
current = &node.next;
}
print!("null");Solution
Step 1: Understand insertion
The new node with data 1 is created with next pointing to old head (node with data 2). So list starts with 1, then 2.Step 2: Trace printing loop
Printing starts at head (1), then moves to next (2), then next is None, so ends with null.Final Answer:
1 -> 2 -> null -> Option AQuick Check:
New node at front, list prints 1 then 2 [OK]
- Confusing order of nodes after insertion
- Not updating head pointer
- Printing prev instead of next
let mut head = Some(Box::new(Node { data: 3, prev: None, next: None }));
let new_node = Box::new(Node { data: 1, prev: None, next: head });
head = Some(new_node);
if let Some(ref mut old_head) = head {
old_head.prev = Some(Box::new(Node { data: 1, prev: None, next: None }));
}Solution
Step 1: Check prev pointer update
The code sets old_head.prev to a new node with data 1 instead of linking it to the existing new_node.Step 2: Understand correct linking
Prev pointer should point to the new_node itself, not a new separate node.Final Answer:
Incorrectly creates a new node for prev instead of linking to new_node -> Option BQuick Check:
Prev must link to new_node, not new node copy [OK]
- Creating duplicate nodes instead of linking
- Not using mutable references for modification
- Not updating prev pointer at all
Solution
Step 1: Create new node with prev None and next pointing to old head
The new node is first, so prev is None. Next points to old head (node with 3).Step 2: Update old head's prev pointer to new node and head pointer to new node
Old head's prev must point back to new node. Head pointer must be updated to new node.Final Answer:
Create new node with prev None, next old head; set old head prev to new node; update head to new node -> Option DQuick Check:
New node prev None, next old head; old head prev new node; update head [OK]
- Setting new node prev to old head
- Not updating old head prev pointer
- Not updating head pointer
Ready to prove it?
Pass the test and this pattern moves unknown
