Delete multiple occurrences of key in Linked list using double pointer Last Updated : 10 Jan, 2024 Summarize Comments Improve Suggest changes Share Like Article Like Report Given a singly linked list, delete all occurrences of a given key in it. For example, consider the following list. Input: 2 -> 2 -> 4 -> 3 -> 2 Key to delete = 2Output: 4 -> 3 Recommended: Please solve it on "PRACTICE" first, before moving on to the solution.This is mainly an alternative of this post which deletes multiple occurrences of a given key using separate condition loops for head and remaining nodes. Here we use a double pointer approach to use a single loop irrespective of the position of the element (head, tail or between). The original method to delete a node from a linked list without an extra check for the head was explained by Linus Torvalds in his "25th Anniversary of Linux" TED talk. This article uses that logic to delete multiple recurrences of the key without an extra check for the head. Explanation: 1. Store address of head in a double pointer till we find a non "key" node. This takes care of the 1st while loop to handle the special case of the head. 2. If a node is not "key" node then store the address of node->next in pp. 3. if we find a "key" node later on then change pp (ultimately node->next) to point to current node->next. Following is C++ implementation for the same. Implementation: C++ // CPP program to delete multiple // occurrences of a key using single // loop. #include <iostream> using namespace std; // A linked list node struct Node { int data; struct Node* next; }; struct Node* head = NULL; void printList(struct Node* node) { while (node != NULL) { printf(" %d ", node->data); node = node->next; } } void push(int new_data) { struct Node* new_node = new Node; new_node->data = new_data; new_node->next = (head); (head) = new_node; } void deleteEntry(int key) { // Start from head struct Node** pp = &head; while (*pp) { struct Node* entry = *pp; // If key found, then put // next at the address of pp // delete entry. if (entry->data == key) { *pp = entry->next; delete (entry); } // Else move to next else pp = &(entry->next); } } int main() { push(2); push(2); push(4); push(3); push(2); int key = 2; // key to delete puts("Created Linked List: "); printList(head); printf("\n"); deleteEntry(key); printf("\nLinked List after Deletion of 2: \n"); printList(head); return 0; } Java class Node { int data; Node next; Node(int data) { this.data = data; this.next = null; } } public class DeleteMultipleOccurrences { static Node head = null; static void printList(Node node) { while (node != null) { System.out.print(" " + node.data + " "); node = node.next; } } static void push(int newData) { Node newNode = new Node(newData); newNode.next = head; head = newNode; } static void deleteEntry(int key) { Node pp = head; Node prev = null; while (pp != null) { Node entry = pp; // If key found, then adjust next pointers // and continue if (entry.data == key) { if (prev != null) { prev.next = entry.next; } else { head = entry.next; } } else { prev = entry; } // Move to the next node pp = entry.next; } } public static void main(String[] args) { push(2); push(2); push(4); push(3); push(2); int key = 2; // key to delete System.out.println("Created Linked List:"); printList(head); System.out.println("\nLinked List after Deletion of 2:"); deleteEntry(key); printList(head); } } Python3 # Python3 program to delete multiple # occurrences of a key using single # loop. class Node: def __init__(self, data): self.data = data self.next = None # Function to print the linked list def printList(node): while node: print(node.data, end=" ") node = node.next print() # Function to insert a new node at the beginning def push(new_data): new_node = Node(new_data) new_node.next = head globals()['head'] = new_node # Function to delete all occurrences of a key def delete_entry(key): global head # Start from head entry = head prev = None # Traverse the linked list while entry: # If key found, update the next of the previous node if entry.data == key: if prev: prev.next = entry.next else: head = entry.next # Delete the current entry del entry # Move to the next node entry = prev.next if prev else head else: # Move to the next node prev = entry entry = entry.next # Driver code if __name__ == '__main__': head = None push(2) push(2) push(4) push(3) push(2) key = 2 # key to delete print("Created Linked List:") printList(head) print("\nLinked List after Deletion of 2:") delete_entry(key) printList(head) # This code is contributed by shivamgupta0987654321 C# // C# program to delete multiple // occurrences of a key using single // loop. using System; // A linked list node public class Node { public int data; public Node next; } public class LinkedList { static Node head = null; static void PrintList(Node node) { while (node != null) { Console.Write(" " + node.data + " "); node = node.next; } } static void Push(int newData) { Node newNode = new Node(); newNode.data = newData; newNode.next = head; head = newNode; } static void DeleteEntry(int key) { // Start from head Node pp = head; Node prev = null; while (pp != null) { // If key found, then skip the node if (pp.data == key) { if (prev != null) { prev.next = pp.next; } else { head = pp.next; } pp = pp.next; } // Else move to next else { prev = pp; pp = pp.next; } } } public static void Main(string[] args) { Push(2); Push(2); Push(4); Push(3); Push(2); int key = 2; // key to delete Console.WriteLine("Created Linked List: "); PrintList(head); Console.WriteLine(); DeleteEntry(key); Console.WriteLine("Linked List after Deletion of 2: "); PrintList(head); } } JavaScript // A linked list node class Node { constructor(data) { this.data = data; this.next = null; } } let head = null; // Function to print the linked list function printList(node) { while (node !== null) { console.log(` ${node.data} `); node = node.next; } } // Function to insert a new node at the beginning of the linked list function push(new_data) { const new_node = new Node(new_data); new_node.next = head; head = new_node; } // Function to delete all occurrences of a key in the linked list function deleteEntry(key) { let current = head; let prev = null; while (current !== null) { if (current.data === key) { if (prev === null) { head = current.next; } else { prev.next = current.next; } current = current.next; } else { prev = current; current = current.next; } } } // Insert some values into the linked list push(2); push(2); push(4); push(3); push(2); // Print the original linked list console.log("Created Linked List: "); printList(head); console.log("\n"); // Delete all occurrences of key = 2 const keyToDelete = 2; deleteEntry(keyToDelete); // Print the linked list after deletion console.log(`Linked List after Deletion of ${keyToDelete}: `); printList(head); OutputCreated Linked List: 2 3 4 2 2 Linked List after Deletion of 2: 3 4 Complexity Analysis: Time Complexity: O(n)Auxiliary Space: O(1), as no extra space is required Comment More infoAdvertise with us Next Article Delete multiple occurrences of key in Linked list using double pointer N NayanGadre Follow Improve Article Tags : Linked List C/C++ Puzzles Data Structures DSA cpp-pointer cpp-double-pointer +2 More Practice Tags : Data StructuresLinked List Similar Reads DSA Tutorial - Learn Data Structures and Algorithms DSA (Data Structures and Algorithms) is the study of organizing data efficiently using data structures like arrays, stacks, and trees, paired with step-by-step procedures (or algorithms) to solve problems effectively. Data structures manage how data is stored and accessed, while algorithms focus on 7 min read Quick Sort QuickSort is a sorting algorithm based on the Divide and Conquer that picks an element as a pivot and partitions the given array around the picked pivot by placing the pivot in its correct position in the sorted array. It works on the principle of divide and conquer, breaking down the problem into s 12 min read Merge Sort - Data Structure and Algorithms Tutorials Merge sort is a popular sorting algorithm known for its efficiency and stability. It follows the divide-and-conquer approach. It works by recursively dividing the input array into two halves, recursively sorting the two halves and finally merging them back together to obtain the sorted array. Merge 14 min read Data Structures Tutorial Data structures are the fundamental building blocks of computer programming. They define how data is organized, stored, and manipulated within a program. Understanding data structures is very important for developing efficient and effective algorithms. What is Data Structure?A data structure is a st 2 min read Bubble Sort Algorithm Bubble Sort is the simplest sorting algorithm that works by repeatedly swapping the adjacent elements if they are in the wrong order. This algorithm is not suitable for large data sets as its average and worst-case time complexity are quite high.We sort the array using multiple passes. After the fir 8 min read Breadth First Search or BFS for a Graph Given a undirected graph represented by an adjacency list adj, where each adj[i] represents the list of vertices connected to vertex i. Perform a Breadth First Search (BFS) traversal starting from vertex 0, visiting vertices from left to right according to the adjacency list, and return a list conta 15+ min read Binary Search Algorithm - Iterative and Recursive Implementation Binary Search Algorithm is a searching algorithm used in a sorted array by repeatedly dividing the search interval in half. The idea of binary search is to use the information that the array is sorted and reduce the time complexity to O(log N). Binary Search AlgorithmConditions to apply Binary Searc 15 min read Insertion Sort Algorithm Insertion sort is a simple sorting algorithm that works by iteratively inserting each element of an unsorted list into its correct position in a sorted portion of the list. It is like sorting playing cards in your hands. You split the cards into two groups: the sorted cards and the unsorted cards. T 9 min read Array Data Structure Guide In this article, we introduce array, implementation in different popular languages, its basic operations and commonly seen problems / interview questions. An array stores items (in case of C/C++ and Java Primitive Arrays) or their references (in case of Python, JS, Java Non-Primitive) at contiguous 4 min read Sorting Algorithms A Sorting Algorithm is used to rearrange a given array or list of elements in an order. For example, a given array [10, 20, 5, 2] becomes [2, 5, 10, 20] after sorting in increasing order and becomes [20, 10, 5, 2] after sorting in decreasing order. There exist different sorting algorithms for differ 3 min read Like