#include <iostream>
#include <unordered_map>
using namespace std;
struct Node {
int data;
Node* next;
};
void removeSingles(Node* head) {
unordered_map<int, int> count;
Node* curr = head;
while (curr != nullptr) {
count[curr->data]++;
curr = curr->next;
}
curr = head;
Node* prev = nullptr;
while (curr != nullptr) {
if (count[curr->data] == 1) {
if (prev == nullptr) {
head = curr->next;
delete curr;
curr = head;
} else {
prev->next = curr->next;
delete curr;
curr = prev->next;
}
} else {
prev = curr;
curr = curr->next;
}
}
}
void printList(Node* head) {
Node* curr = head;
while (curr != nullptr) {
cout << curr->data << " ";
curr = curr->next;
}
cout << endl;
}
int main() {
Node* head = new Node{1, new Node{2, new Node{3, new Node{2, new Node{4, new Node{5, nullptr}}}}}};
printList(head);
removeSingles(head);
printList(head);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBOb2RlIHsKICAgIGludCBkYXRhOwogICAgTm9kZSogbmV4dDsKfTsKCnZvaWQgcmVtb3ZlU2luZ2xlcyhOb2RlKiBoZWFkKSB7CiAgICB1bm9yZGVyZWRfbWFwPGludCwgaW50PiBjb3VudDsKICAgIE5vZGUqIGN1cnIgPSBoZWFkOwogICAgd2hpbGUgKGN1cnIgIT0gbnVsbHB0cikgewogICAgICAgIGNvdW50W2N1cnItPmRhdGFdKys7CiAgICAgICAgY3VyciA9IGN1cnItPm5leHQ7CiAgICB9CgogICAgY3VyciA9IGhlYWQ7CiAgICBOb2RlKiBwcmV2ID0gbnVsbHB0cjsKICAgIHdoaWxlIChjdXJyICE9IG51bGxwdHIpIHsKICAgICAgICBpZiAoY291bnRbY3Vyci0+ZGF0YV0gPT0gMSkgewogICAgICAgICAgICBpZiAocHJldiA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICBoZWFkID0gY3Vyci0+bmV4dDsKICAgICAgICAgICAgICAgIGRlbGV0ZSBjdXJyOwogICAgICAgICAgICAgICAgY3VyciA9IGhlYWQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwcmV2LT5uZXh0ID0gY3Vyci0+bmV4dDsKICAgICAgICAgICAgICAgIGRlbGV0ZSBjdXJyOwogICAgICAgICAgICAgICAgY3VyciA9IHByZXYtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcmV2ID0gY3VycjsKICAgICAgICAgICAgY3VyciA9IGN1cnItPm5leHQ7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIHByaW50TGlzdChOb2RlKiBoZWFkKSB7CiAgICBOb2RlKiBjdXJyID0gaGVhZDsKICAgIHdoaWxlIChjdXJyICE9IG51bGxwdHIpIHsKICAgICAgICBjb3V0IDw8IGN1cnItPmRhdGEgPDwgIiAiOwogICAgICAgIGN1cnIgPSBjdXJyLT5uZXh0OwogICAgfQogICAgY291dCA8PCBlbmRsOwp9CgppbnQgbWFpbigpIHsKICAgIE5vZGUqIGhlYWQgPSBuZXcgTm9kZXsxLCBuZXcgTm9kZXsyLCBuZXcgTm9kZXszLCBuZXcgTm9kZXsyLCBuZXcgTm9kZXs0LCBuZXcgTm9kZXs1LCBudWxscHRyfX19fX19OwogICAgcHJpbnRMaXN0KGhlYWQpOwogICAgcmVtb3ZlU2luZ2xlcyhoZWFkKTsKICAgIHByaW50TGlzdChoZWFkKTsKICAgIHJldHVybiAwOwp9Cg==