Remove Node by Value from Linked List - codepath/compsci_guides GitHub Wiki
Unit 5 Session 2 (Click for link to problem statements)
U-nderstand
Understand what the interviewer is asking for by using test cases and questions about the problem.
- What should happen if the first node (head) contains the value
val
?- If the head node has the value
val
, it should be removed and the function should return the next node as the new head of the list.
- If the head node has the value
P-lan
Plan the solution with appropriate visualizations and pseudocode.
General Idea: Traverse the linked list to find and remove the first node with the given value val
. Adjust the links appropriately to maintain the list's integrity.
1) Check if the linked list is empty; if so, return the head as is.
2) Check if the head node contains the value `val`:
- If it does, set the head to `head.next` to remove the first node and return the new head.
3) Use two pointers, `previous` and `current`, to traverse the list:
- `previous` starts at the head, and `current` starts at `head.next`.
- Loop through the list to find the node with value `val`.
- If found, adjust `previous.next` to skip `current`, effectively removing it from the list.
4) Return the head of the list, which could be unchanged if no node with `val` was found.
⚠️ Common Mistakes
- Not properly handling the case where the node to remove is the
head
. - Failing to update the
next
pointer of theprevious
node, which could leave the list incorrectly linked. - Returning the head inside the loop, which could stop the function prematurely without removing the node.
I-mplement
def ll_remove(head, val):
# Check if the list is empty
if head is None:
return head
# If the node to be removed is the head of the list
if head.value == val:
return head.next
# Initialize pointers
current = head.next
previous = head
# Traverse the list to find the node to remove
while current:
if current.value == val:
# Remove the node by skipping it
previous.next = current.next
return head
previous = current
current = current.next
# If no node was found with the value `val`, return the original head
return head