Bird
Raised Fist0
DSA Rustprogramming~3 mins

Why Insert at Beginning of Doubly Linked List in DSA Rust?

Choose your learning style10 modes available
The Big Idea

What if you could add new items instantly at the start without moving everything else?

The Scenario

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.

The Problem

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.

The Solution

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.

Before vs After
✗ Before
let mut list = vec!["Alice", "Bob", "Charlie"];
list.insert(0, "Zara");
✓ After
let mut list = DoublyLinkedList::new();
list.insert_at_beginning("Zara");
What It Enables

This lets you build and update lists efficiently, even when they grow large, without slowing down.

Real Life Example

Think of a music playlist where the newest song always plays first. Adding songs at the start quickly keeps the playlist fresh.

Key Takeaways

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

(1/5)
1. What is the main purpose of inserting a node at the beginning of a doubly linked list?
easy
A. To remove the first node from the list
B. To add a new node at the end of the list
C. To add a new node as the first element, updating head pointer
D. To reverse the entire list

Solution

  1. Step 1: Understand the operation

    Inserting at the beginning means adding a new node before the current first node.
  2. Step 2: Effect on head pointer

    The head pointer must be updated to point to this new node, making it the first element.
  3. Final Answer:

    To add a new node as the first element, updating head pointer -> Option C
  4. Quick Check:

    Insert at beginning = update head to new node [OK]
Hint: New node becomes head; update pointers accordingly [OK]
Common Mistakes:
  • Confusing insertion at beginning with insertion at end
  • Not updating the head pointer
  • Not adjusting previous pointer of old head
2. Which of the following Rust code snippets correctly creates a new node and inserts it at the beginning of a doubly linked list?
easy
A. let new_node = Box::new(Node { data: val, prev: None, next: head }); head = Some(new_node);
B. let new_node = Node { data: val, prev: head, next: None }; head = Some(Box::new(new_node));
C. head = Some(Box::new(Node { data: val, prev: None, next: None }));
D. let new_node = Box::new(Node { data: val, prev: None, next: None }); tail = Some(new_node);

Solution

  1. 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.
  2. Step 2: Update head to new node

    After creating the new node, the head pointer must be updated to point to this new node.
  3. Final Answer:

    let new_node = Box::new(Node { data: val, prev: None, next: head }); head = Some(new_node); -> Option A
  4. Quick Check:

    New node prev None, next head, update head [OK]
Hint: Prev None, next old head, then update head [OK]
Common Mistakes:
  • Setting prev to head instead of None
  • Not boxing the new node
  • Updating tail instead of head
3. Given the following Rust code for inserting at the beginning of a doubly linked list, what will be the printed list after insertion?
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");
medium
A. 1 -> 2 -> null
B. 2 -> 1 -> null
C. 1 -> null
D. 2 -> null

Solution

  1. 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.
  2. Step 2: Trace printing loop

    Printing starts at head (1), then moves to next (2), then next is None, so ends with null.
  3. Final Answer:

    1 -> 2 -> null -> Option A
  4. Quick Check:

    New node at front, list prints 1 then 2 [OK]
Hint: New node points to old head; print follows next pointers [OK]
Common Mistakes:
  • Confusing order of nodes after insertion
  • Not updating head pointer
  • Printing prev instead of next
4. Identify the error in this Rust code snippet that tries to insert a node at the beginning of a doubly linked list:
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 }));
}
medium
A. Fails to update head pointer
B. Incorrectly creates a new node for prev instead of linking to new_node
C. Does not set new_node.next to old head
D. Uses immutable reference instead of mutable

Solution

  1. 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.
  2. Step 2: Understand correct linking

    Prev pointer should point to the new_node itself, not a new separate node.
  3. Final Answer:

    Incorrectly creates a new node for prev instead of linking to new_node -> Option B
  4. Quick Check:

    Prev must link to new_node, not new node copy [OK]
Hint: Prev pointer links to existing node, not a new duplicate [OK]
Common Mistakes:
  • Creating duplicate nodes instead of linking
  • Not using mutable references for modification
  • Not updating prev pointer at all
5. You have a doubly linked list with nodes containing values 3 <-> 5 <-> 7. You want to insert 1 at the beginning. Which sequence of pointer updates is correct to maintain list integrity?
hard
A. Create new node with prev old head, next old head; update head to new node
B. Create new node with prev old head, next None; set old head next to new node; update head to new node
C. Create new node with prev None, next None; update head to new node only
D. Create new node with prev None, next old head; set old head prev to new node; update head to new node

Solution

  1. 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).
  2. 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.
  3. Final Answer:

    Create new node with prev None, next old head; set old head prev to new node; update head to new node -> Option D
  4. Quick Check:

    New node prev None, next old head; old head prev new node; update head [OK]
Hint: New node prev None, next old head; old head prev new node; update head [OK]
Common Mistakes:
  • Setting new node prev to old head
  • Not updating old head prev pointer
  • Not updating head pointer
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard