easy - just walk along the list and delete duplicate items.
but how to know an item is a duplicate?
well, for every item we could scan the list from the beginning, but this is a ridiculously naive solution - how about keeping all values we encounter while iterating and checking if we have already met a current value?
putting those in an unordered set would be good enough i'd say
#include#include using namespace std; struct List { int data = 0; List* next = nullptr; List(int x) : data(x) {} }; void remove_duplicates(List* head) { std::unordered_set cache; cache.insert(head->data); List* next = head->next; while (next != nullptr) { if (cache.count(next->data) > 0) { head->next = next->next; delete next; next = head->next; } else { cache.insert(next->data); head = next; next = head->next; } } } int main() { List* head = new List(1); List* list = head; for (int index = 2; index < 10; ++index) { List* next = new List(index); //a silly way to make duplicates in the list if (next->data % 2 == 0) { next->data = 2; } else if (next->data % 3 == 0) { next->data = 3; } list->next = next; list = next; } remove_duplicates(head); while (head != nullptr) { printf("%d\n", head->data); head = head->next; } return 0; }
https://ideone.com/K19v5o