13.删除单链表中重复的元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了13.删除单链表中重复的元素相关的知识,希望对你有一定的参考价值。

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;
               }
          }
     }
}                

  

以上是关于13.删除单链表中重复的元素的主要内容,如果未能解决你的问题,请参考以下文章

删除有序链表中的重复结点

删除重复元素

链表 | 去除递增有序单链表中的重复元素

C语言使用二级指针借助递归工作栈删除单链表中所有值为x的元素

被火车撞了都不能忘记的几道题(你会了吗?)

从单链表中删除元素 (C++)