Open In App

Delete all occurrences of a given key in a linked list

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Share
Report issue
Report

Given a singly linked list, delete all occurrences of a given key in it. For example, consider the following list.

Example:

Input: 2 -> 2 -> 1 -> 8 -> 2 ->  3 -> 2 -> 7
       Key to delete = 2
Output:  1 -> 8 -> 3 -> 7 

This is mainly an extension of this post which deletes the first occurrence of a given key
We need to first check for all occurrences at the head node and change the head node appropriately. Then we need to check for all occurrences inside a loop and delete them one by one. 

Below is the implementation of the above idea:

C++




// C++ program to delete all occurrences
// of a given key in linked list
#include <bits/stdc++.h>
using namespace std;
  
// A linked list node
class Node {
public:
    int data;
    Node* next;
};
  
// Given a reference (pointer) to the head
// of a list and an int, inserts a new node
// on the front of the list
Node* push(Node* head, int new_data)
{
    Node* new_node = new Node();
    new_node->data = new_data;
    new_node->next = head;
    head = new_node;
    return head;
}
  
// Given a reference (pointer)to the head
// of a list and a key, deletes all
// occurrence of the given key in
// linked list
Node* deleteKey(Node* head, int x)
{
    // In Linked List is empty Just return it
    if (!head)
        return head;
    // Until the head data is equal to the key move the head
    // pointer
    while (head && head->data == x)
        head = head->next;
    Node *curr = head, *prev = nullptr;
  
    while (curr) {
        if (curr->data == x)
            prev->next = curr->next;
        else
            prev = curr;
        curr = curr->next;
    }
    return head;
}
  
// This function prints contents of
// linked list starting from the
// given node
void printList(Node* node)
{
    while (node) {
        cout << node->data << " ";
        node = node->next;
    }
}
  
// Driver code
int main()
{
  
    // Start with the empty list
    Node* head = NULL;
    head = push(head, 7);
    head = push(head, 2);
    head = push(head, 3);
    head = push(head, 2);
    head = push(head, 8);
    head = push(head, 1);
    head = push(head, 2);
    head = push(head, 2);
  
    // Key to delete
    int key = 2;
    cout << "Created Linked List:\n ";
    printList(head);
    // Function call
    head = deleteKey(head, key);
  
    if (!head)
        cout << "\nNo element present in the Linked list"
             << endl;
    else {
        cout << "\nLinked List after Deletion is:\n";
        printList(head);
    }
    return 0;
}
  
// This code is contributed by Aditya Kumar (aditykumar129)


C




// C Program to delete all occurrences of a given key in
// linked list
#include <stdio.h>
#include <stdlib.h>
  
// A linked list node
typedef struct Node {
    int data;
    struct Node* next;
} Node;
  
/* Given a reference (pointer to pointer) to the head of a
   list and an int, inserts a new node on the front of the
   list. */
void push(struct Node** head_ref, int new_data)
{
    struct Node* new_node
        = (struct Node*)malloc(sizeof(struct Node));
    new_node->data = new_data;
    new_node->next = (*head_ref);
    (*head_ref) = new_node;
}
  
/* Given a reference (pointer to pointer) to the head of a
   list and a key, deletes all occurrence of the given key
   in linked list */
Node* deleteKey(Node* head, int x)
{
    if (!head)
        return head;
    // Until the head data is equal to the key move the head
    // pointer
    while (head && head->data == x)
        head = head->next;
    Node *curr = head, *prev = NULL;
    while (curr) {
        if (curr->data == x)
            prev->next = curr->next;
        else
            prev = curr;
        curr = curr->next;
    }
    return head;
}
  
// This function prints contents of linked list starting
// from the given node
void printList(Node* node)
{
    while (node != NULL) {
        printf(" %d ", node->data);
        node = node->next;
    }
}
  
// Driver code
int main()
{
    // Start with the empty list
    struct Node* head = NULL;
  
    push(&head, 7);
    push(&head, 2);
    push(&head, 3);
    push(&head, 2);
    push(&head, 8);
    push(&head, 1);
    push(&head, 2);
    push(&head, 2);
  
    int key = 2; // key to delete
  
    puts("Created Linked List: ");
    printList(head);
  
    // Function call
    head = deleteKey(head, key);
    if (!head)
        printf("\nNo element present in the Linked list\n");
    else {
        printf("\nLinked List after Deletion is:\n");
        printList(head);
    }
    return 0;
}


Java




// Java Program to delete all occurrences
// of a given key in linked list
class LinkedList 
{
    static Node head; // head of list
  
    /* Linked list Node*/
    class Node 
    {
        int data;
        Node next;
        Node(int d)
        {
            data = d;
            next = null;
        }
    }
  
    /* Given a key, deletes all occurrence
    of the given key in linked list */
    void deleteKey(int key)
    {
        // Store head node
        Node temp = head, prev = null;
  
        // If head node itself holds the key
        // or multiple occurrences of key
        while (temp != null && temp.data == key) 
        {
            head = temp.next; // Changed head
            temp = head; // Change Temp
        }
  
        // Delete occurrences other than head
        while (temp != null
        {
            // Search for the key to be deleted,
            // keep track of the previous node
            // as we need to change 'prev->next'
            while (temp != null && temp.data != key) 
            {
                prev = temp;
                temp = temp.next;
            }
  
            // If key was not present in linked list
            if (temp == null)
                return;
  
            // Unlink the node from linked list
            prev.next = temp.next;
  
            // Update Temp for next iteration of outer loop
            temp = prev.next;
        }
    }
  
    /* Inserts a new Node at front of the list. */
    public void push(int new_data)
    {
        Node new_node = new Node(new_data);
        new_node.next = head;
        head = new_node;
    }
  
    /* This function prints contents of linked list
    starting from the given node */
    public void printList()
    {
        Node tnode = head;
        while (tnode != null
        {
            System.out.print(tnode.data + " ");
            tnode = tnode.next;
        }
    }
  
    // Driver Code
    public static void main(String[] args)
    {
        LinkedList llist = new LinkedList();
  
        llist.push(7);
        llist.push(2);
        llist.push(3);
        llist.push(2);
        llist.push(8);
        llist.push(1);
        llist.push(2);
        llist.push(2);
  
        int key = 2; // key to delete
  
        System.out.println("Created Linked list is:");
        llist.printList();
  
        // Function call
        llist.deleteKey(key);
  
        System.out.println(
            "\nLinked List after Deletion is:");
        llist.printList();
    }
}
  
// This code is contributed by Shubham


Python3




# Python3 program to delete all occurrences
# of a given key in linked list
  
# Link list node
  
  
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
  
# Given a reference (pointer to pointer)
# to the head of a list and an int,
# inserts a new node on the front of the list.
  
  
def push(head_ref, new_data):
    new_node = Node(0)
    new_node.data = new_data
    new_node.next = (head_ref)
    (head_ref) = new_node
    return head_ref
  
# Given a reference (pointer to pointer)
# to the head of a list and a key,
# deletes all occurrence of the given key
# in linked list
  
  
def deleteKey(head_ref, key):
  
    # Store head node
    temp = head_ref
    prev = None
  
    # If head node itself holds the key
    # or multiple occurrences of key
    while (temp != None and temp.data == key):
        head_ref = temp.next  # Changed head
        temp = head_ref         # Change Temp
  
    # Delete occurrences other than head
    while (temp != None):
  
        # Search for the key to be deleted,
        # keep track of the previous node
        # as we need to change 'prev.next'
        while (temp != None and temp.data != key):
            prev = temp
            temp = temp.next
  
        # If key was not present in linked list
        if (temp == None):
            return head_ref
  
        # Unlink the node from linked list
        prev.next = temp.next
  
        # Update Temp for next iteration of outer loop
        temp = prev.next
    return head_ref
  
# This function prints contents of linked list
# starting from the given node
  
  
def printList(node):
    while (node != None):
        print(node.data, end=" ")
        node = node.next
  
  
# Driver Code
if __name__ == '__main__':
  
    # Start with the empty list
    head = None
  
    head = push(head, 7)
    head = push(head, 2)
    head = push(head, 3)
    head = push(head, 2)
    head = push(head, 8)
    head = push(head, 1)
    head = push(head, 2)
    head = push(head, 2)
  
    key = 2  # key to delete
  
    print("Created Linked List: ")
    printList(head)
  
    # Function call
    head = deleteKey(head, key)
    print("\nLinked List after Deletion is: ")
  
    printList(head)
  
# This code is contributed by Arnab Kundu


C#




// C# Program to delete all occurrences
// of a given key in linked list
using System;
  
class GFG 
{
    static Node head; // head of list
  
    /* Linked list Node*/
    public class Node 
    {
        public int data;
        public Node next;
        public Node(int d)
        {
            data = d;
            next = null;
        }
    }
  
    /* Given a key, deletes all occurrence
    of the given key in linked list */
    void deleteKey(int key)
    {
        // Store head node
        Node temp = head, prev = null;
  
        // If head node itself holds the key
        // or multiple occurrences of key
        while (temp != null && temp.data == key)
        {
            head = temp.next; // Changed head
            temp = head; // Change Temp
        }
  
        // Delete occurrences other than head
        while (temp != null
        {
            // Search for the key to be deleted,
            // keep track of the previous node
            // as we need to change 'prev->next'
            while (temp != null && temp.data != key) 
            {
                prev = temp;
                temp = temp.next;
            }
  
            // If key was not present in linked list
            if (temp == null)
                return;
  
            // Unlink the node from linked list
            prev.next = temp.next;
  
            // Update Temp for next iteration of outer loop
            temp = prev.next;
        }
    }
  
    /* Inserts a new Node at front of the list. */
    public void Push(int new_data)
    {
        Node new_node = new Node(new_data);
        new_node.next = head;
        head = new_node;
    }
  
    /* This function prints contents of linked list
    starting from the given node */
    public void printList()
    {
        Node tnode = head;
        while (tnode != null
        {
            Console.Write(tnode.data + " ");
            tnode = tnode.next;
        }
    }
  
    // Driver Code
    public static void Main(String[] args)
    {
        GFG llist = new GFG();
  
        llist.Push(7);
        llist.Push(2);
        llist.Push(3);
        llist.Push(2);
        llist.Push(8);
        llist.Push(1);
        llist.Push(2);
        llist.Push(2);
  
        int key = 2; // key to delete
  
        Console.WriteLine("Created Linked list is:");
        llist.printList();
  
        // Function call
        llist.deleteKey(key);
  
        Console.WriteLine(
            "\nLinked List after Deletion is:");
        llist.printList();
    }
}
  
// This code is contributed by 29AjayKumar


Javascript




<script>
  
// JavaScript program to delete all occurrences
// of a given key in linked list
  
// Node for linked list
  
class Node {
        constructor() {
        this.data = 0;
        this.next = null;
            }
}
  
// Given a reference (pointer) to the head
// of a list and an int, inserts a new node
// on the front of the list
function push( head, new_data)
{
    var new_node = new Node();
    new_node.data = new_data;
    new_node.next = head;
    head = new_node;
    return head;
}
   
// Given a reference (pointer)to the head
// of a list and a key, deletes all
// occurrence of the given key in
// linked list
function deleteKey( head, x)
{
       
    // Store head node
    var tmp = head;
       
    while (head.data == x)
    {
        head = head.next;
    }
    while (tmp.next != null)
    {
        if (tmp.next.data == x)
        {
            tmp.next = tmp.next.next;
        }
        else
        {
            tmp = tmp.next;
        }
    }
    return head;
}
   
// This function prints contents of
// linked list starting from the
// given node
function printList( node)
{
    while (node.next != null)
    {
        document.write(node.data + " ");
        node = node.next;
    }
    document.write(node.data);
}
  
// Driver Code
  
// Start with the empty list
var head = null;
head = push(head, 7);
head = push(head, 2);
head = push(head, 3);
head = push(head, 2);
head = push(head, 8);
head = push(head, 1);
head = push(head, 2);
head = push(head, 2);
       
// Key to delete
let key = 2 ;
    
document.write("Created Linked List: " + "</br>");
printList(head);
    
// Function call
head = deleteKey(head, key);
document.write("</br>"+ "Linked List after Deletion is:" "</br>");
       
printList(head);
      
</script>


Output

Created Linked List: 
 2  2  1  8  2  3  2  7 
Linked List after Deletion is:
 1  8  3  7 

Time complexity: O(n)
Auxiliary Space: O(1)

 



Last Updated : 10 Jan, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads