DEV Community

Cover image for Remove Duplicates From Sorted Linked List.
Dhanashree Rugi
Dhanashree Rugi

Posted on

Remove Duplicates From Sorted Linked List.

Suppose you are given a sorted linked list, you need to traverse a linked list, remove the duplicates from the list if exists and then print the resultant sorted linked list.

Example 1 :

Input : Linked List : 1, 2, 2, 3, 3, 4, 5
Output : Linked List after removing duplicates : 1, 2, 3, 4, 5

Example 2 :

Input : Linked List : 5, 5, 6, 7, 8, 8
Output : Linked List after removing duplicates : 5, 6, 7, 8

Steps :

  • Declare two pointers currentNode and nextNode of type struct node.

  • Make currentNode to point the head node of the linked list.

  • Keep iterating through the linked list until last node is reached.

  • Compare the data of current node with the data of next node.

  • If they are equal, then detach one of the node(which is considered as duplicate) from the list by saving its neighbour node's address into pointer nextNode i.e., nextNode = currentNode->next->next. Then break the link between current node and the duplicate node and attach the current node to the node pointing to by pointer nextNode i.e., currentNode->next = nextNode.

  • If not, then continue traversing the linked list.

  • Finally, print the linked list.

C program that removes the duplicates from sorted linked list :

*******************************************************************************/
#include <stdio.h>
#include <stdlib.h> 

struct node
{
    int data;
    struct node * next;
};

void displayLL(struct node * head)
{
    struct node * temp;
    temp = head;
    temp=head;
    while(temp!=0)
    {
       printf("%d ",temp->data);
       temp = temp->next;
    }
}

void removeDup(struct node *head)
{
    struct node *currentNode = head;
    struct node *nextNode;

    while(currentNode != NULL && currentNode->next != NULL)
  {
       if(currentNode->data == currentNode->next->data )
       {   
           nextNode = currentNode->next->next;
        if(nextNode == NULL)
           {
             currentNode->next = NULL;
             break;
           }
           currentNode->next = nextNode;
       }   
       if(currentNode->data != currentNode->next->data)
       {
           currentNode = currentNode->next;
       }
   }
    printf("\n--------------------------------\n");
    printf("Linked List after removing duplicates : ");
    displayLL(head);
}

int main()
{
   struct node *head = 0, *newnode, *temp; 
   int n, choice, newdata;

// Create Linked List // 

   printf("Enter the number of nodes in the list : ");
   scanf("%d", &n);
   for(int i = 1; i<=n; i++)
   {
     newnode = (struct node *)malloc(sizeof(struct node));
     printf("Enter the data%d : ", i);
     scanf("%d", &newnode->data);
     newnode->next = 0;
     if(head == 0)
     {
        head = temp = newnode;
     } 
     else
       { 
        temp->next = newnode;
        temp = newnode;
       }
    }
   printf("--------------------------------\n");
   printf("Linked list : ");

   displayLL(head);
   removeDup(head);
}
Enter fullscreen mode Exit fullscreen mode

For more detail watch this video.

Top comments (0)