Delete a Node from Circular Linked List in DSA Rust - Build from Scratch
Create a struct called Node with fields data: i32 and next: Option<Rc<RefCell<Node>>>. Then create four nodes with values 10, 20, 30, and 40 linked in a circular way. Store the head node in a variable called head. Use Rc and RefCell for shared ownership and mutability.
Import Rc and RefCell. Define the Node struct. Create Rc<RefCell<Node>> for each node and link them circularly using borrow_mut() and clone().
Create a variable called key and set it to 30. This represents the value of the node to delete from the circular linked list.
Just create a variable key and assign it the value 30.
Write a function called delete_node that takes head: Option<Rc<RefCell<Node>>> and key: i32 as parameters and returns Option<Rc<RefCell<Node>>>. This function should delete the node with value key from the circular linked list and return the new head.
Use Rc::ptr_eq to detect cycles. Traverse with prev_rc and curr_rc, update prev_rc.next to skip the node with key using borrow_mut(). Handle head deletion by returning the next node as new head.
Write code to print the circular linked list starting from head in the format: 10 -> 20 -> 40 -> (back to head). Use a loop to traverse until you reach the head again by comparing data.
Clone the head Rc. Traverse using current_rc = current_rc.borrow().next.as_ref().unwrap().clone(). Print data with -> until back to start_data, then print (back to head).
Practice
Solution
Step 1: Understand the structure of a single-node circular linked list
In a circular linked list with one node, the node's next pointer points to itself.Step 2: Delete the only node
Removing this node means no nodes remain, so the list becomes empty (null).Final Answer:
The list becomes empty (null). -> Option CQuick Check:
Single node deleted = empty list [OK]
- Assuming the list still contains the deleted node
- Thinking the list points to itself after deletion
- Expecting an error instead of empty list
Solution
Step 1: Understand Rust ownership for circular references
Rust disallows direct cyclic ownership. Using Rc allows multiple owners and interior mutability.Step 2: Identify correct syntax for mutable circular linked list node
struct Node { data: i32, next: Option> } uses Option> which supports cycles and mutability safely.Final Answer:
struct Node { data: i32, next: Option> } -> Option DQuick Check:
Use Rc for circular mutable nodes [OK]
- Using plain Box<Node> causes ownership errors
- Using references (&Node) disallows ownership
- Using Node directly causes infinite size error
let mut head = create_circular_list(vec![1, 2, 3, 4]); delete_node(&mut head, 3); print_list(&head);What is the printed output?
Solution
Step 1: Understand the initial list
The list is circular with nodes 1, 2, 3, 4 linked in a loop.Step 2: Delete node with value 3
Node 3 is removed, so the list becomes 1 -> 2 -> 4, then back to 1.Final Answer:
1 -> 2 -> 4 -> 1 (circular) -> Option AQuick Check:
Deleted 3, list loops 1-2-4 [OK]
- Forgetting to link node 2 to node 4
- Printing null instead of circular loop
- Not deleting the correct node
fn delete_node(head: &mut Option>, key: i32) { let mut curr = head.clone().unwrap(); while curr.borrow().data != key { curr = curr.borrow().next.clone().unwrap(); } let next_node = curr.borrow().next.clone(); curr.borrow_mut().next = next_node.unwrap().borrow().next.clone(); }Solution
Step 1: Analyze the while loop condition
The loop continues until curr's data equals key, but no check if key exists, so it loops infinitely if key missing.Step 2: Check for missing exit condition
Without a break or stop when full circle is done, infinite loop occurs if key not found.Final Answer:
It causes infinite loop if key not found. -> Option AQuick Check:
No key check = infinite loop risk [OK]
- Assuming key always exists
- Not checking for full circle traversal
- Ignoring unwrap() panic risks
Solution
Step 1: Locate the last node in the circular list
The last node points back to head; find it by traversing until next points to head.Step 2: Update last node's next pointer and head
Set last node's next to head's next node, then update head to head's next to maintain circularity.Final Answer:
Find last node, link it to head's next, update head to head's next. -> Option BQuick Check:
Update last node and head to delete head safely [OK]
- Setting head to None breaks circularity
- Not updating last node's next pointer
- Deleting head without adjusting links
Ready to prove it?
Pass the test and this pattern moves unknown
