Delete by Value in Doubly Linked List in DSA C - Time & Space Complexity
When deleting a node by value in a doubly linked list, we want to know how long it takes as the list grows.
We ask: How does the time to find and delete a value change with list size?
Analyze the time complexity of the following code snippet.
void deleteByValue(Node** head, int value) {
Node* current = *head;
while (current != NULL && current->data != value) {
current = current->next;
}
if (current == NULL) return; // value not found
if (current->prev != NULL) current->prev->next = current->next;
else *head = current->next;
if (current->next != NULL) current->next->prev = current->prev;
free(current);
}
This code searches for the first node with the given value and removes it from the doubly linked list.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The while loop that moves through nodes to find the value.
- How many times: Up to n times, where n is the number of nodes in the list.
As the list grows, the search may take longer because it might check more nodes.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | Up to 10 checks |
| 100 | Up to 100 checks |
| 1000 | Up to 1000 checks |
Pattern observation: The number of steps grows roughly in direct proportion to the list size.
Time Complexity: O(n)
This means the time to delete by value grows linearly with the number of nodes in the list.
[X] Wrong: "Deleting by value is always fast because we just remove one node."
[OK] Correct: You must first find the node, which can take time proportional to the list size if the value is near the end or missing.
Understanding this helps you explain how searching affects deletion speed in linked lists, a common topic in coding interviews.
"What if the list was sorted? How would that change the time complexity of deleting by value?"
Practice
Solution
Step 1: Locate the node with the given value
Traverse the list from head to tail to find the node whose data matches the value to delete.Step 2: Update links to remove the node
Adjust the previous node's next pointer and the next node's previous pointer to bypass the node to be deleted.Final Answer:
The node with the matching value is removed and links are updated -> Option BQuick Check:
Deleting by value removes matching node [OK]
- Not updating previous node's next pointer
- Not updating next node's previous pointer
- Deleting wrong node without checking value
Solution
Step 1: Understand pointer usage for head modification
Since deleting a node may change the head pointer, we pass a pointer to the head pointer (Node** head).Step 2: Confirm function return type
The function deletes a node and does not return a node or int, so return type is void.Final Answer:
void deleteByValue(Node** head, int val) { /* code */ } -> Option AQuick Check:
Use double pointer to modify head [OK]
- Passing head as single pointer when head may change
- Returning wrong type from delete function
- Not using void when no return needed
Solution
Step 1: Identify which node is deleted
Deleting by value removes the first node with value 3, which is the second node in the list.Step 2: Update links and list after deletion
After removing the first 3, the list becomes 1 <-> 5 <-> 3 <-> 7, keeping the second 3 intact.Final Answer:
1 <-> 5 <-> 3 <-> 7 -> Option DQuick Check:
Only first matching node deleted [OK]
- Deleting all nodes with value 3 instead of first
- Not updating links correctly after deletion
- Deleting wrong node (like last 3 instead of first)
void deleteByValue(Node** head, int val) {
Node* temp = *head;
while (temp != NULL && temp->data != val) {
temp = temp->next;
}
if (temp == NULL) return;
if (temp->prev != NULL) temp->prev->next = temp->next;
if (temp->next != NULL) temp->next->prev = temp->prev;
free(temp);
}Solution
Step 1: Check head update when deleting first node
If the node to delete is the head, the head pointer must be updated to the next node, but this code does not do that.Step 2: Confirm other parts are correct
Memory is freed, loop ends correctly, and only one node is deleted, so no other errors.Final Answer:
Does not update head if first node is deleted -> Option CQuick Check:
Update head pointer when deleting first node [OK]
- Forgetting to update head pointer
- Not freeing memory after deletion
- Incorrect loop causing infinite iteration
Solution
Step 1: Delete node with value 10 (head node)
Removing the head node 10 updates the head pointer to node 20, so list becomes 20 <-> 30 <-> 40.Step 2: Insert new node with value 5 at head
Create a new node with value 5, set its next to current head (20), update 20's prev to new node, and update head pointer to new node.Step 3: Final list after operations
The list is now 5 <-> 20 <-> 30 <-> 40.Final Answer:
5 <-> 20 <-> 30 <-> 40 -> Option AQuick Check:
Delete head, then insert new head [OK]
- Not updating head after deletion
- Not linking new node correctly at head
- Appending new node at tail instead of head
Ready to prove it?
Pass the test and this pattern moves unknown
