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

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 C implementation for the same.

`// C Program to delete all occurrences of a given key in linked list ` `#include <stdio.h> ` `#include <stdlib.h> ` ` ` `// 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; ` `}` |

Output:

Created Linked List: 2 2 1 8 2 3 2 7 Linked List after Deletion of 1: 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.

## Recommended Posts:

- Multiply two numbers represented by Linked Lists
- Delete middle of linked list
- Delete a Linked List node at a given position
- Find Length of a Linked List (Iterative and Recursive)
- Construct a Maximum Sum Linked List out of two Sorted Linked Lists having some Common nodes
- Linked List | Set 3 (Deleting a node)
- Sort a linked list of 0s, 1s and 2s
- Delete a given node in Linked List under given constraints
- Detect and Remove Loop in a Linked List
- Delete nodes which have a greater value on right side
- Remove duplicates from an unsorted linked list
- Remove duplicates from a sorted linked list
- Function to check if a singly linked list is palindrome
- Detect loop in a linked list
- Reverse a linked list