LeetCode Problem Workspace

Remove Linked List Elements

Remove all nodes from a linked list that have a specific value, adjusting pointers to preserve the rest of the list.

category

2

Topics

code_blocks

7

Code langs

hub

3

Related

Practice Focus

Easy · Linked-list pointer manipulation

bolt

Answer-first summary

Remove all nodes from a linked list that have a specific value, adjusting pointers to preserve the rest of the list.

Interview AiBox logo

Ace coding interviews with Interview AiBox guidance for Linked-list pointer manipulation

Try AiBox Copilotarrow_forward

The task is to remove all nodes with a given value from a linked list. We aim to solve this by manipulating the pointers directly, ensuring the list is updated efficiently. Whether using iteration or recursion, this problem tests the ability to traverse and modify a linked list while handling edge cases.

Problem Statement

Given the head of a linked list and an integer val, remove all nodes from the linked list where the node's value equals val. The list should be returned with all matching nodes excluded. If the linked list is empty or contains no matching nodes, simply return the head.

For example, if the input is head = [1,2,6,3,4,5,6] and val = 6, the output should be the list [1,2,3,4,5]. If the list is head = [] with val = 1, the output will be an empty list []. Edge cases such as an empty list or a list where all elements match the value must be handled efficiently.

Examples

Example 1

Input: head = [1,2,6,3,4,5,6], val = 6

Output: [1,2,3,4,5]

Example details omitted.

Example 2

Input: head = [], val = 1

Output: []

Example details omitted.

Example 3

Input: head = [7,7,7,7], val = 7

Output: []

Example details omitted.

Constraints

  • The number of nodes in the list is in the range [0, 104].
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

Solution Approach

Pointer Manipulation (Iteration)

In this approach, we traverse the list using two pointers: a previous pointer and the current pointer. The previous pointer will help us remove nodes by adjusting its next pointer when the current node's value matches the target value.

Recursive Solution

Using recursion, we can recursively move through the linked list. For each node, if its value matches the target, we skip over it by recursively calling the function on the next node. This approach ensures that nodes are removed while maintaining the structure of the list.

Handling Edge Cases

When implementing either the iterative or recursive approach, it's crucial to handle edge cases. These include an empty list, a list where no nodes match the target value, and a list where all nodes match the target value.

Complexity Analysis

Metric Value
Time Depends on the final approach
Space Depends on the final approach

The time complexity is O(n), where n is the number of nodes in the list, as we traverse the entire list once. The space complexity depends on the approach: O(1) for iteration and O(n) for recursion due to the recursive call stack.

What Interviewers Usually Probe

  • Checks for understanding of linked list pointer manipulation.
  • Tests ability to handle edge cases, including empty lists or lists where all nodes are removed.
  • Evaluates familiarity with both iterative and recursive solutions.

Common Pitfalls or Variants

Common pitfalls

  • Failing to handle edge cases like an empty list or a list where no nodes match the value.
  • Incorrectly updating the 'next' pointer when removing nodes, potentially causing cycles or missed nodes.
  • Not considering the space complexity implications of recursion for large lists.

Follow-up variants

  • Implementing a solution where the target value is provided in reverse order.
  • Solving the problem with a doubly linked list where both 'next' and 'prev' pointers must be adjusted.
  • Modifying the list in place without using extra space for a new list or recursion.

FAQ

What is the most efficient way to solve the Remove Linked List Elements problem?

The most efficient approach is using iteration with pointer manipulation. This solution has O(n) time complexity and O(1) space complexity.

Can recursion be used to solve the Remove Linked List Elements problem?

Yes, recursion can be used. It will have O(n) time complexity but O(n) space complexity due to the recursive call stack.

What should be done if the linked list is empty in the Remove Linked List Elements problem?

If the linked list is empty, simply return the head as there are no nodes to remove.

How do I handle the case where no nodes match the target value?

If no nodes match the target value, the list remains unchanged, and you should return the original head of the list.

How does the Remove Linked List Elements problem test pointer manipulation skills?

This problem tests pointer manipulation by requiring adjustments to the 'next' pointers while traversing the linked list, ensuring nodes are removed efficiently.

terminal

Solution

Solution 1

#### Python3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeElements(self, head: ListNode, val: int) -> ListNode:
        dummy = ListNode(-1, head)
        pre = dummy
        while pre.next:
            if pre.next.val != val:
                pre = pre.next
            else:
                pre.next = pre.next.next
        return dummy.next
Remove Linked List Elements Solution: Linked-list pointer manipulation | LeetCode #203 Easy