Remove Linked List Elements

Updated on 01 July, 2025
Remove Linked List Elements header image

Problem Statement

The given problem entails modifying a linked list by removing all nodes whose value matches a specified integer val. The task is to process the linked list, which is initiated from its head node, and systematically eliminate any nodes coinciding with val. Finally, the function should return the head of the newly adjusted linked list, which may be altered or reduced depending on the values contained within the original list. The aspects to focus on include addressing the presence of the target value at various points such as the beginning, middle, or end of the list, and ensuring the correct linkage of the remaining nodes post-deletion to maintain the integrity of the linked list.

Examples

Example 1

Input:

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

Output:

[1,2,3,4,5]

Example 2

Input:

head = [], val = 1

Output:

[]

Example 3

Input:

head = [7,7,7,7], val = 7

Output:

[]

Constraints

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

Approach and Intuition

To tackle the problem of removing nodes from a linked list based on a value comparison, consider the following approach:

  1. Initialize a dummy node, which simplifies edge cases such as removing the head node or handling an empty list. Point the dummy node's next to the head of the linked list.
  2. Use two pointers: one for traversing the list (current) and another (prev) to maintain a link to the previous node, which helps in node removal. Start both pointers at the dummy node.
  3. Iterate through the linked list using the current pointer:
    • If current's node value equals val, adjust the prev's next pointer to skip the current node, effectively removing it from the list.
    • If the value does not match, just move the prev pointer to current.
    • Always advance current to its next node in either situation.
  4. After the loop, since your dummy node points to the possibly new head of the list (especially if the original head was removed), return dummy.next as the new head.

This method ensures that all nodes matching the target value are efficiently removed while maintaining the original order of the remaining nodes. It adeptly handles various scenarios demonstrated in the examples, including:

  • A non-empty list where selected values need removal.
  • An already empty list.
  • A list where every element matches the target value and thus needs complete deletion.

These steps accommodate the constraints, where the linked list size and the node values could vary, requiring a robust yet simple solution.

Solutions

  • C++
  • Java
  • Python
cpp
class Solution {
  public:
  ListNode* eliminateValue(ListNode* startNode, int targetVal) {
    ListNode* dummyHead = new ListNode(0);
    dummyHead->next = startNode;
    
    ListNode *prevNode = dummyHead, *current = startNode, *tempDelete = nullptr;
    while (current != nullptr) {
      if (current->val == targetVal) {
        prevNode->next = current->next;
        tempDelete = current;
      } else prevNode = current;
    
      current = current->next;
    
      if (tempDelete != nullptr) {
        delete tempDelete;
        tempDelete = nullptr;
      }
    }
    
    ListNode *finalHead = dummyHead->next;
    delete dummyHead;
    return finalHead;
  }
};

The solution pertains to a function within a C++ class that intelligently removes all nodes in a linked list which contain a specified target value. The approach utilizes a dummy head node to handle edge cases smoothly, such as the removal of the head node itself.

The function eliminateValue accepts two parameters:

  • startNode: the head of the linked list.
  • targetVal: the value to be removed from the list.

Key Steps of the Implementation:

  1. Configure a dummyHead node, which points to the startNode. This dummy helps to simplify node deletion logic, especially at the head of the list.

  2. Initialize pointer variables: prevNode to keep track of the node preceding the current one, and current which iterates over the list. tempDelete is used as a temporary container to safely delete nodes.

  3. Traverse through the linked list using a while loop. For each node:

    • Check if the current node's value matches with the targetVal. If so, adjust the prevNode's next pointer to bypass the current node, effectively removing it from the list.
    • If the value does not match, move the prevNode pointer to the current node.
    • Progress the current pointer to the next node in the list.
  4. Addresses memory management by deleting nodes that contain the target value immediately after detaching them from the list to prevent memory leaks.

  5. After completion of the loop, the function cleans up by setting a new head (this could be different if the head was removed), and deallocates the dummyHead.

Finally, return finalHead, which points to the potentially new head of the updated list after all necessary nodes have been removed.

This solution ensures efficient traversal of the linked list and proper memory management while removing targeted elements, making it robust and effective for linked list manipulation in C++.

java
class Solution {
  public ListNode deleteNodes(ListNode headNode, int targetVal) {
    ListNode dummyNode = new ListNode(0);
    dummyNode.next = headNode;
    
    ListNode previous = dummyNode, current = headNode;
    while (current != null) {
      if (current.val == targetVal) previous.next = current.next;
      else previous = current;
      current = current.next;
    }
    return dummyNode.next;
  }
}

The provided Java code implements a function to remove elements from a linked list that match a specified target value. Here's the method you'll use to accomplish this task:

  • A ListNode class is assumed to exist, with members val and next.
  • The method deleteNodes accepts the head of the linked list (headNode) and the value to be removed (targetVal).
  • Use a dummy node (dummyNode) that points to the head of the list to handle edge cases where the head node might be removed.
  • Initialize two pointers, previous set to the dummy node, and current set to the head node.
  • Iterate through the linked list using the current pointer:
    • If the current node's value equals targetVal, adjust the previous node's next pointer to bypass the current node, effectively removing it from the list.
    • If the current node's value is not the target, just move previous to the current node.
    • Always progress the current node to the next node in the list.
  • Finally, return the new head of the list which is the next of the dummy node.

This method ensures that all nodes with a value equal to targetVal are skipped and not included in the returned list. The use of a dummy node simplifies handling deletions at the head, and careful pointer updates ensure that all other deletions are handled correctly without breaking the list.

python
class Solution:
    def deleteNodes(self, head: ListNode, value: int) -> ListNode:
        dummy = ListNode(0)
        dummy.next = head
            
        previous, current = dummy, head
        while current:
            if current.val == value:
                previous.next = current.next
            else:
                previous = current
            current = current.next
            
        return dummy.next

In the provided Python solution for removing elements from a linked list, the function deleteNodes effectively removes all nodes that contain a specific value from the linked list. The process involves the use of a dummy node to handle edge cases smoothly, such as when the head of the list needs to be removed.

  • The dummy node is initialized and its next pointer is set to the head of the list.
  • Two pointers, previous and current, are used to traverse the list. previous always points to the node immediately before current.
  • As you iterate through the list with the current pointer:
    • If the value of the current node matches the target value, it's skipped by updating the next pointer of the previous node to the next node of current.
    • If the value does not match, the previous pointer is simply moved to the current node.
    • The current pointer is always moved to the next node in the list.
  • The function returns the new head of the list, which is dummy.next, as this bypasses the dummy node and reflects any changes made at the head of the list during element removal.

This method is efficient, maintaining a time complexity of O(n), where n is the number of nodes in the list, and it handles all possible scenarios including when the head or multiple consecutive nodes need to be removed.

Comments

No comments yet.