https://leetcode.com/problems/remove-linked-list-elements

Easy linked list traversal problem, without any smart ideas: just traverse list and do what is asked. Two small things which helps to simplify code:

  1. When traverse, always look at the next element in list, because if we already at element with value equal to val, we can not delete it, we need to go back somehow.
  2. Use dummy head to deal with case when head is equal to val.

So, basically our algorithm looks like this: we traverse our list and if value of next element is equal to val, we need to delete it, so we do start.next = start.next.next. Note, that in this case we do not move our pointers, because there can be more element equal to val. If value is not equal to val, we move to the next element.

Complexity: time complexity is O(n) with only one pass, space complexity is O(1), because we do not use any additional memory except couple of variable.

class Solution:
    def removeElements(self, head, val):
        dummy = ListNode(-1)
        dummy.next = head
        start = dummy
        while start.next:
            if start.next.val == val:
                start.next = start.next.next
            else:
                start = start.next         
        return dummy.next   

If you like the solution, you can upvote it on leetcode discussion section: Problem 0203