11
作者:
xxdmd8
,
2024-12-19 22:26:47
,
所有人可见
,
阅读 5
删除单链表中重复出现的元素
【问题描述】试编写算法删除以 L 为头指针(带头结点)的单链表中重复出现的元素。
【输入形式】元素个数
按照任意顺序输入多个正整数,每个数之间用一个空格隔开
【输出形式】删除重复元素后的数据,数据之间用空格隔开
【样例输入】7
6 6 7 8 9 10 11
【样例输出】6 7 8 9 10 11
#include<iostream>
#include<unordered_set>
using namespace std;
struct ListNode{
int val;
ListNode* next;
};
typedef ListNode* LinkList;
void createList(LinkList& L,int m){
L = new ListNode;
ListNode* r = L;
int x;
for(int i = 0;i < m;i ++){
cin >> x;
ListNode* s = new ListNode;
s->val = x;
s->next = nullptr;
r->next = s;
r = s;
}
}
void printList(LinkList L){
ListNode* p = L->next;
while(p){
cout << p->val << " ";
p = p->next;
}
}
void deleteList(LinkList& L){
ListNode* p = L->next;
while(p){
ListNode* s = new ListNode;
p = p->next;
delete s;
}
delete L;
}
void deleteDuplicates(LinkList L){
if(!L || !(L->next)) return;
LinkList cur = L->next;
while(cur){
ListNode* run = cur;
unordered_set<int> seen; //用于记录已经遇到的元素,避免重复
while(run->next){
if(seen.find(run->next->val) != seen.end() || run->next->val == cur->val){
//run 下一个节点值已经在 seen 中 或 当前元素与 cur 值相同
ListNode* toDel = run->next; //先记录上要删除的元素
run->next = toDel->next;
delete toDel;
}else{ //没有找到当前元素,则继续向后移动 run ,并记录已经遇到的值
run = run->next;
seen.insert(run->val);
}
}
cur = cur->next; //继续判断下一个元素
seen.clear(); //清空 seen 集合
}
}
int main(){
int m;
cin >> m;
LinkList L = nullptr;
createList(L, m);
deleteDuplicates(L);
printList(L);
deleteList(L);
return 0;
}