C++ Program For Removing Duplicates From A Sorted Linked List
Last Updated :
15 Jun, 2022
Write a function that takes a list sorted in non-decreasing order and deletes any duplicate nodes from the list. The list should only be traversed once.
For example if the linked list is 11->11->11->21->43->43->60 then removeDuplicates() should convert the list to 11->21->43->60.
Algorithm:
Traverse the list from the head (or start) node. While traversing, compare each node with its next node. If the data of the next node is the same as the current node then delete the next node. Before we delete a node, we need to store the next pointer of the node
Implementation:
Functions other than removeDuplicates() are just to create a linked list and test removeDuplicates().
C++
// C++ Program to remove duplicates
// from a sorted linked list
#include <bits/stdc++.h>
using namespace std;
// Link list node
class Node
{
public:
int data;
Node* next;
};
// The function removes duplicates
// from a sorted list
void removeDuplicates(Node* head)
{
// Pointer to traverse the linked list
Node* current = head;
// Pointer to store the next pointer
// of a node to be deleted
Node* next_next;
// Do nothing if the list is empty
if (current == NULL)
return;
// Traverse the list till last node
while (current->next != NULL)
{
// Compare current node with next node
if (current->data == current->next->data)
{
// The sequence of steps is important
next_next = current->next->next;
free(current->next);
current->next = next_next;
}
// This is tricky: only advance if no deletion
else
{
current = current->next;
}
}
}
// UTILITY FUNCTIONS
// Function to insert a node at the
// beginning of the linked list
void push(Node** head_ref, int new_data)
{
// Allocate node
Node* new_node = new Node();
// Put in the data
new_node->data = new_data;
// Link the old list off the
// new node
new_node->next = (*head_ref);
// Move the head to point to the
// new node
(*head_ref) = new_node;
}
// Function to print nodes in a
// given linked list
void printList(Node *node)
{
while (node != NULL)
{
cout << " " << node->data;
node = node->next;
}
}
// Driver code
int main()
{
// Start with the empty list
Node* head = NULL;
/* Let us create a sorted linked list
to test the functions. Created
linked list will be
11->11->11->13->13->20 */
push(&head, 20);
push(&head, 13);
push(&head, 13);
push(&head, 11);
push(&head, 11);
push(&head, 11);
cout << "Linked list before duplicate removal ";
printList(head);
// Remove duplicates from linked list
removeDuplicates(head);
cout << "Linked list after duplicate removal ";
printList(head);
return 0;
}
// This code is contributed by rathbhupendra
Output:
Linked list before duplicate removal 11 11 11 13 13 20
Linked list after duplicate removal 11 13 20
Time Complexity: O(n) where n is the number of nodes in the given linked list.
Auxiliary Space: O(1)
Recursive Approach :
C++
// C++ Program to remove duplicates
// from a sorted linked list
#include <bits/stdc++.h>
using namespace std;
// Link list node
class Node
{
public:
int data;
Node* next;
};
// The function removes duplicates
// from a sorted list
void removeDuplicates(Node* head)
{
// Pointer to store the pointer
// of a node to be deleted*/
Node* to_free;
// Do nothing if the list is empty
if (head == NULL)
return;
// Traverse the list till last node
if (head->next != NULL)
{
// Compare head node with next node
if (head->data == head->next->data)
{
/* The sequence of steps is important.
to_free pointer stores the next of
head pointer which is to be deleted.*/
to_free = head->next;
head->next = head->next->next;
free(to_free);
removeDuplicates(head);
}
/* This is tricky: only advance if
no deletion */
else
{
removeDuplicates(head->next);
}
}
}
// UTILITY FUNCTIONS
// Function to insert a node at the
// beginning of the linked list
void push(Node** head_ref,
int new_data)
{
// Allocate node
Node* new_node = new Node();
// Put in the data
new_node->data = new_data;
// Link the old list off the
// new node
new_node->next = (*head_ref);
// Move the head to point to
// the new node
(*head_ref) = new_node;
}
/* Function to print nodes
in a given linked list */
void printList(Node *node)
{
while (node != NULL)
{
cout << " " << node->data;
node = node->next;
}
}
// Driver code
int main()
{
// Start with the empty list
Node* head = NULL;
/* Let us create a sorted linked
list to test the functions
Created linked list will be
11->11->11->13->13->20 */
push(&head, 20);
push(&head, 13);
push(&head, 13);
push(&head, 11);
push(&head, 11);
push(&head, 11);
cout <<
"Linked list before duplicate removal ";
printList(head);
// Remove duplicates from linked list
removeDuplicates(head);
cout <<
"Linked list after duplicate removal ";
printList(head);
return 0;
}
// This code is contributed by Ashita Gupta
Output:
Linked list before duplicate removal 11 11 11 13 13 20
Linked list after duplicate removal 11 13 20
Time Complexity: O(n), where n is the number of nodes in the given linked list.
Auxiliary Space: O(n), due to recursive stack where n is the number of nodes in the given linked list.
Another Approach: Create a pointer that will point towards the first occurrence of every element and another pointer temp which will iterate to every element and when the value of the previous pointer is not equal to the temp pointer, we will set the pointer of the previous pointer to the first occurrence of another node.
Below is the implementation of the above approach:
C++
// C++ program to remove duplicates
// from a sorted linked list
#include <bits/stdc++.h>
using namespace std;
// Linked list Node
struct Node
{
int data;
Node *next;
Node(int d)
{
data = d;
next = NULL;
}
};
// Function to remove duplicates
// from the given linked list
Node *removeDuplicates(Node *head)
{
// Two references to head temp will
// iterate to the whole Linked List
// prev will point towards the first
// occurrence of every element
Node *temp = head,*prev=head;
// Traverse list till the last node
while (temp != NULL)
{
// Compare values of both pointers
if(temp->data != prev->data)
{
/* if the value of prev is not equal
to the value of temp that means
there are no more occurrences of
the prev data-> So we can set the
next of prev to the temp node->*/
prev->next = temp;
prev = temp;
}
// Set the temp to the next node
temp = temp->next;
}
/* This is the edge case if there are more than
one occurrences of the last element */
if(prev != temp)
{
prev->next = NULL;
}
return head;
}
Node *push(Node *head, int new_data)
{
/* 1 & 2: Allocate the Node &
Put in the data*/
Node *new_node = new Node(new_data);
/* 3. Make next of new Node as head */
new_node->next = head;
/* 4. Move the head to point to new Node */
head = new_node;
return head;
}
// Function to print linked list
void printList(Node *head)
{
Node *temp = head;
while (temp != NULL)
{
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
}
// Driver code
int main()
{
Node *llist = NULL;
llist = push(llist,20);
llist = push(llist,13);
llist = push(llist,13);
llist = push(llist,11);
llist = push(llist,11);
llist = push(llist,11);
cout <<
("List before removal of duplicates");
printList(llist);
cout <<
("List after removal of elements");
llist = removeDuplicates(llist);
printList(llist);
}
// This code is contributed by mohit kumar 29.
Output:
List before removal of duplicates
11 11 11 13 13 20
List after removal of elements
11 13 20
Time Complexity: O(n) where n is the number of nodes in the given linked list.
Auxiliary Space: O(1), no extra space is required, so it is a constant.
Another Approach: Using Maps
The idea is to push all the values in a map and printing its keys.
Below is the implementation of the above approach:
C++
// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
// Link list node
struct Node
{
int data;
Node* next;
Node()
{
data = 0;
next = NULL;
}
};
/* Function to insert a node at
the beginning of the linked
list */
void push(Node** head_ref,
int new_data)
{
// Allocate node
Node* new_node = new Node();
// Put in the data
new_node->data = new_data;
// Link the old list off
// the new node
new_node->next = (*head_ref);
// Move the head to point
// to the new node
(*head_ref) = new_node;
}
/* Function to print nodes
in a given linked list */
void printList(Node* node)
{
while (node != NULL)
{
cout << node->data << " ";
node = node->next;
}
}
// Function to remove duplicates
void removeDuplicates(Node* head)
{
unordered_map<int, bool> track;
Node* temp = head;
while (temp)
{
if (track.find(temp->data) == track.end())
{
cout << temp->data << " ";
}
track[temp->data] = true;
temp = temp->next;
}
}
// Driver Code
int main()
{
Node* head = NULL;
/* Created linked list will be
11->11->11->13->13->20 */
push(&head, 20);
push(&head, 13);
push(&head, 13);
push(&head, 11);
push(&head, 11);
push(&head, 11);
cout <<
"Linked list before duplicate removal ";
printList(head);
cout <<
"Linked list after duplicate removal ";
removeDuplicates(head);
return 0;
}
// This code is contributed by yashbeersingh42
Output:
Linked list before duplicate removal 11 11 11 13 13 20
Linked list after duplicate removal 11 13 20
Time Complexity: O(n) where n is the number of nodes.
Auxiliary Space: O(n) where n is the number of nodes.
Please refer complete article on Remove duplicates from a sorted linked list for more details!
Similar Reads
C++ Programming Language C++ is a computer programming language developed by Bjarne Stroustrup as an extension of the C language. It is known for is fast speed, low level memory management and is often taught as first programming language. It provides:Hands-on application of different programming concepts.Similar syntax to
5 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
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
Dijkstra's Algorithm to find Shortest Paths from a Source to all Given a weighted undirected graph represented as an edge list and a source vertex src, find the shortest path distances from the source vertex to all other vertices in the graph. The graph contains V vertices, numbered from 0 to V - 1.Note: The given graph does not contain any negative edge. Example
12 min read
Object Oriented Programming in C++ Object Oriented Programming - As the name suggests uses objects in programming. Object-oriented programming aims to implement real-world entities like inheritance, hiding, polymorphism, etc. in programming. The main aim of OOP is to bind together the data and the functions that operate on them so th
5 min read
Maximum Subarray Sum - Kadane's Algorithm Given an integer array arr[], find the subarray (containing at least one element) which has the maximum possible sum, and return that sum.Note: A subarray is a continuous part of an array.Examples:Input: arr[] = [2, 3, -8, 7, -1, 2, 3]Output: 11Explanation: The subarray [7, -1, 2, 3] has the largest
8 min read
0/1 Knapsack Problem Given n items where each item has some weight and profit associated with it and also given a bag with capacity W, [i.e., the bag can hold at most W weight in it]. The task is to put the items into the bag such that the sum of profits associated with them is the maximum possible. Note: The constraint
15+ min read
30 OOPs Interview Questions and Answers [2025 Updated] Object-oriented programming, or OOPs, is a programming paradigm that implements the concept of objects in the program. It aims to provide an easier solution to real-world problems by implementing real-world entities such as inheritance, abstraction, polymorphism, etc. in programming. OOPs concept is
15 min read
Heap Sort - Data Structures and Algorithms Tutorials Heap sort is a comparison-based sorting technique based on Binary Heap Data Structure. It can be seen as an optimization over selection sort where we first find the max (or min) element and swap it with the last (or first). We repeat the same process for the remaining elements. In Heap Sort, we use
14 min read