Given a sorted linked list, remove all the duplicates from the list. For example, given 1->2->3->3->6, return 1->2->6. Another example, given 1->1->1->2->4, return 2->4.
typedef struct node Node;
/* The function removes duplicates from a sorted list */
void removeDuplicates(Node** head)
{
/* do nothing if the list is empty */
Node* current = *head;
if(current == NULL)
return;
/* Pointer to traverse the linked list */
Node* pre_head = (Node*) malloc(sizeof(Node));
pre_head->next = *head;
/* Pointer to store the next pointer of a node to be deleted*/
Node* next_next;
Node* pre = pre_head;
bool deleted = false;
/* 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;
deleted = true;
}
else if (deleted) {
pre->next = current->next;
free(current);
current = pre->next;
deleted = false;
}
else {
pre = current;
current = current->next;
}
}
/* remove the last duplicated node*/
if (deleted) {
pre->next = NULL;
free(current);
}
*head = pre_head->next;
free(pre_head);
}
To test the code, please use the testing program from http://www.geeksforgeeks.org/remove-duplicates-from-a-sorted-linked-list/.