Delete all occurrences of a given key in a linked list

03 Jul, 2022
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
Java
Python3
C#
Javascript
// C++ program to delete all occurrences// of a given key in linked list#include <bits/stdc++.h>using namespace std;  // A linked list nodeclass 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 listNode* 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 listNode* 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 nodevoid printList(Node* node){    while (node) {        cout << node->data << " ";        node = node->next;    }}  // Driver codeint 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 Program to delete all occurrences of a given key in// linked list#include <stdio.h>#include <stdlib.h>  // A linked list nodetypedef 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 nodevoid printList(Node* node){    while (node != NULL) {        printf(" %d ", node->data);        node = node->next;    }}  // Driver codeint 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 Program to delete all occurrences// of a given key in linked listclass 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 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 Codeif __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# Program to delete all occurrences// of a given key in linked listusing 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
<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 listfunction 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 listfunction 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 nodefunction printList( node){    while (node.next != null)    {        document.write(node.data + " ");        node = node.next;    }    document.write(node.data);}  // Driver Code  // Start with the empty listvar 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 deletelet key = 2 ;    document.write("Created Linked List: " + "</br>");printList(head);    // Function callhead = deleteKey(head, key);document.write("</br>"+ "Linked List after Deletion is:" +  "</br>");       printList(head);      </script>
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)
This article is contributed by Saransh. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
nobody_cares
nidhi_biet
29AjayKumar
andrew1234
shreeshtripathi05
SudheerKumar3
shibbbos
jana_sayantan
adityakumar129
technophpfij
hardikkoriintern
Amazon
Samsung
Linked List
Amazon
Samsung
Linked List
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
LinkedList in Java
Introduction to Data Structures
Doubly Linked List | Set 1 (Introduction and Insertion)
Merge two sorted linked lists
What is Data Structure: Types, Classifications and Applications
Linked List vs Array
Merge Sort for Linked Lists
Implementing a Linked List in Java using Class
Queue - Linked List Implementation
Function to check if a singly linked list is palindrome