# Delete all occurrences of a given key in a linked list

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

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

## Recommended: Please solve it on “PRACTICE” first, before moving on to the solution.

This is mainly an extension of this post which deletes first occurrence of a given key.

We need to first check for all occurrences at 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. Following is the implementation for the same.

## 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; ` `    ``} ` `} ` ` `  `/* Drier program to test above functions*/` `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); ` ` `  `    ``deleteKey(&head, key); ` `    ``puts``(``"\nLinked List after Deletion of 1: "``); ` ` `  `    ``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();  ` ` `  `        ``llist.deleteKey(key); ` ` `  `        ``System.out.println(``"\nLinked List after Deletion is:"``);  ` `        ``llist.printList();  ` `    ``}  ` `}  ` ` `  `// This code is contributed by Shubham `

Output:

```Created Linked List:
2  2  1  8  2  3  2  7
Linked List after Deletion of 1:
1  8  3  7
```

My Personal Notes arrow_drop_up

Improved By : nobody_cares

Article Tags :
Practice Tags :

5

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.