码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-09-30 07:46:41      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

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.删除单链表中重复的元素

标签:

原文地址:http://www.cnblogs.com/claremore/p/5922506.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!