Related Articles
Delete all occurrences of a given key in a linked list
• Difficulty Level : Easy
• Last Updated : 05 Nov, 2020

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 ``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)``{``    ` `    ``// Store head node``    ``Node *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``void` `printList(Node* node)``{``    ``while` `(node->next != NULL)``    ``{``        ``cout << node->data << ``" "``;``        ``node = node->next;``    ``}``    ``cout << node->data;``}`` ` `// 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);``    ``cout << ``"\nLinked List after Deletion is:\n"``;``    ` `    ``printList(head);``    ` `    ``return` `0;``}` `// This code is contributed by shivamsharma2020`

## C

 `// C Program to delete all occurrences of a given key in``// linked list``#include ``#include ` `// A linked list node``struct` `Node``{``    ``int` `data;``    ``struct` `Node* next;``};` `/* 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 */``void` `deleteKey(``struct` `Node** head_ref, ``int` `key)``{``    ``// Store head node``    ``struct` `Node *temp = *head_ref, *prev;` `    ``// If head node itself holds the key or multiple``    ``// occurrences of key``    ``while` `(temp != NULL && temp->data == key)``    ``{``        ``*head_ref = temp->next; ``// Changed head``        ``free``(temp); ``// free old head``        ``temp = *head_ref; ``// 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;` `        ``free``(temp); ``// Free memory` `        ``// Update Temp for next iteration of outer loop``        ``temp = prev->next;``    ``}``}` `// This function prints contents of linked list starting``// from the given node``void` `printList(``struct` `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``    ``deleteKey(&head, key);``    ``puts``(``"\nLinked List after Deletion is:"``);` `    ``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`
Output
```Created Linked List:
2  2  1  8  2  3  2  7
Linked List after Deletion is:
1  8  3  7

```

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.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up