13.删除单链表中重复的元素
思路:
用Hashtable辅助,遍历一遍单链表就能搞定。同高级函数9的原因,我不太会使用C++STL中的hash。而如果使用set集合来存储链表中的所有的值,实际上效率和每次重新遍历单链表是一样的。“用了c++标准库中的set来保存访问过的元素,所以很方便的就可以判断当前节点是否在set集合中,直接使用set提供的find函数就可以了。而且使用set的查找在时间复杂度上比较低。”我不太清楚STL中set集合的实现方式,如果是基于类似hash结构的话,那自然效率O(1),而如果是数组的话,实际在遍历一遍,所以效率O(n)。不过貌似后者的可能性大一些。
void DeleteDuplexElements(Node*Head);
//删除单链表中的重复元素(使用set集合来实现) void DeleteDuplexElements(Node*Head) { if(Head==NULL||Head->next==NULL) //链表为空或者只有一个元素 { return ; } //以下至少有两个元素 set<int>s; Node* p1=Head; Node* p2=Head->next; s.clear(); s.insert(p1->value); while(p2!=NULL) //要删除的不可能是链表头,因为如果是链表头,则集合还为空 { if(s.find(p2->value)==s.end()) //没有 { s.insert(p2->value); p2=p2->next; p1=p1->next; } else //已经有,则要删除该节点 { if(p2->next==NULL) //如果是链表尾 { p1->next=NULL; free(p2); p2=NULL; } else { p1->next=p2->next; free(p2); p2=p1->next; } } } }
时间: 2024-12-29 23:56:45