Concept Flow - Insert at Beginning Head Insert
Create new node
New node.next = current head
Update head to new node
Done
Insert a new node by creating it, linking it to the current head, then updating head to this new node.
struct Node {
data: i32,
next: Option<Box<Node>>,
}
fn insert_at_beginning(head: &mut Option<Box<Node>>, value: i32) {
let new_node = Box::new(Node { data: value, next: head.take() });
*head = Some(new_node);
}| Step | Operation | Nodes in List | Pointer Changes | Visual State |
|---|---|---|---|---|
| 1 | Start with empty list | ∅ | head = None | head → ∅ |
| 2 | Create new node with data=10 | Node(10) | new_node.next = None | new_node(10) → ∅ |
| 3 | Set new_node.next = head (None) | Node(10) | new_node.next = None | new_node(10) → ∅ |
| 4 | Update head to new_node | Node(10) | head → new_node | head → ┌────────┐ │ data:10│ │ next:∅ │ └────────┘ |
| 5 | Insert new node with data=20 at beginning | Node(20) → Node(10) | new_node.next = head (Node(10)) | new_node(20) → new_node(10) → ∅ |
| 6 | Update head to new_node (20) | Node(20) → Node(10) | head → new_node(20) | head → ┌────────┐ ┌────────┐ │ data:20│ ──→ │ data:10│ │ next:──┼──→ │ next:∅ │ └────────┘ └────────┘ |
| 7 | Insert new node with data=30 at beginning | Node(30) → Node(20) → Node(10) | new_node.next = head (Node(20)) | new_node(30) → new_node(20) → new_node(10) → ∅ |
| 8 | Update head to new_node (30) | Node(30) → Node(20) → Node(10) | head → new_node(30) | head → ┌────────┐ ┌────────┐ ┌────────┐ │ data:30│ ──→ │ data:20│ ──→ │ data:10│ │ next:──┼──→ │ next:──┼──→ │ next:∅ │ └────────┘ └────────┘ └────────┘ |
| 9 | End of insertions | Node(30) → Node(20) → Node(10) | head points to Node(30) | head → ┌────────┐ ┌────────┐ ┌────────┐ │ data:30│ ──→ │ data:20│ ──→ │ data:10│ │ next:──┼──→ │ next:──┼──→ │ next:∅ │ └────────┘ └────────┘ └────────┘ |
| Variable | Start | After Step 2 | After Step 4 | After Step 5 | After Step 6 | After Step 7 | After Step 8 | Final |
|---|---|---|---|---|---|---|---|---|
| head | None | None | Node(10) | Node(10) | Node(20) | Node(20) | Node(30) | Node(30) |
| new_node | N/A | Node(10) | N/A | Node(20) | N/A | Node(30) | N/A | N/A |
Insert at Beginning (Head Insert): - Create new node with data - Set new_node.next to current head - Update head to new_node - New node becomes first in list - Works even if list is empty - Head always points to newest node
let mut list = LinkedList::new(); list.insert_at_beginning(10); list.insert_at_beginning(20); list.insert_at_beginning(30); list.print();Assuming print() shows nodes from head to tail.
fn insert_at_beginning(&mut self, data: i32) {
let new_node = Box::new(Node { data, next: self.head });
self.head = Some(new_node);
}Pass the test and this pattern moves unknown