Linked List - Remove Linked List Elements
All diagrams presented herein are original creations, meticulously designed to enhance comprehension and recall. Crafting these aids required considerable effort, and I kindly request attribution if this content is reused elsewhere.
Difficulty : Easy
Two Pointers, use
set()
Problem
Given the head
of a linked list and an integer val
, remove all the nodes of the linked list that has Node.val == val
, and return the new head.
Example 1:
1
2
Input: head = [1,2,6,3,4,5,6], val = 6
Output: [1,2,3,4,5]
Example 2:
1
2
Input: head = [], val = 1
Output: []
Example 3:
1
2
Input: head = [7,7,7,7], val = 7
Output: []
Solution
We need a dummy node here as the very first node could be equal to val
. The highlevel idea is to start a new head pointer (prev
) pointing at the dummy
pointer & whenever curr!=val
, add the node to the new head. This way the new head will have all the nodes where curr.val!=val
1
2
3
dummy = ListNode(0,head)
prev=dummy
curr=head
Next, in a loop keep traversing through curr
pointer. If curr.val!=val
then add the node to prev
pointer.
1
2
3
if curr.val != val:
prev.next=curr
prev=curr
We also need to point curr
to curr.next
1
curr = curr.next
We are almost done, except one modification needed when the last node is equal to val
, (refer the diagrams) in that case prev.next
will still point to the last node as previously we have set prev=curr
and curr.next=7
which is undesiarable.
Now for this edge case, we need to explicitly set prev.next=None
.
1
2
elif curr.next is None:
prev.next=None
Final Code
Here is the full code.
1
2
3
4
5
6
7
8
9
10
11
12
13
def remove_elements(head, val):
dummy=ListNode(0,head)
curr=dummy.next
prev=dummy
while curr:
if curr.val != val:
prev.next=curr
prev=curr
elif curr.next is None:
prev.next=None
curr=curr.next
return dummy.next
Runtime Complexity
The runtime will be O(n)
as we are simply scanning through the list once.