Bird
Raised Fist0
DSA Rustprogramming~10 mins

Insert at Beginning of Doubly Linked List in DSA Rust - Interactive Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to create a new node with the given value.

DSA Rust
let new_node = Box::new(Node { data: [1], prev: None, next: None });
Drag options to blanks, or click blank then click option'
Ahead
Bnode
Cvalue
DNone
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'head' or 'node' instead of the value for the data field.
Setting data to None which is invalid for the data type.
2fill in blank
medium

Complete the code to update the previous pointer of the old head node.

DSA Rust
if let Some(old_head) = self.head.as_mut() {
    old_head.prev = Some([1]);
}
Drag options to blanks, or click blank then click option'
Anew_node
BNone
Cold_head
Dself.head
Attempts:
3 left
💡 Hint
Common Mistakes
Setting prev to None which breaks the link.
Using old_head or self.head instead of new_node.
3fill in blank
hard

Fix the error in updating the head pointer to point to the new node.

DSA Rust
self.head = Some([1]);
Drag options to blanks, or click blank then click option'
ABox::new(new_node)
Bnew_node
C&new_node
D*new_node
Attempts:
3 left
💡 Hint
Common Mistakes
Dereferencing new_node which causes a type mismatch.
Using a reference instead of ownership.
Wrapping new_node again in Box::new causing double boxing.
4fill in blank
hard

Fill both blanks to correctly link the new node and the old head.

DSA Rust
new_node.next = [1];
if let Some(ref mut next_node) = new_node.next {
    next_node.prev = [2];
}
Drag options to blanks, or click blank then click option'
Aself.head.take()
BSome(Box::new(new_node))
CSome(new_node)
DNone
Attempts:
3 left
💡 Hint
Common Mistakes
Using None for next or prev which breaks the list.
Wrapping new_node incorrectly causing ownership errors.
5fill in blank
hard

Fill all three blanks to complete the insert_at_beginning function for the doubly linked list.

DSA Rust
pub fn insert_at_beginning(&mut self, value: i32) {
    let mut new_node = Box::new(Node { data: [1], prev: None, next: None });
    new_node.next = [2];
    if let Some(ref mut next_node) = new_node.next {
        next_node.prev = [3];
    }
    self.head = Some(new_node);
}
Drag options to blanks, or click blank then click option'
Avalue
Bself.head.take()
CSome(new_node)
DNone
Attempts:
3 left
💡 Hint
Common Mistakes
Not using take() causing borrowing errors.
Incorrectly wrapping new_node causing ownership issues.
Setting prev or next to None incorrectly.

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