2015年408算法题

举报
野猪佩奇996 发表于 2022/01/24 00:51:40 2022/01/24
【摘要】 1 )算法的基本设计思想 算法的核心思想是用空间换时间。使用辅助数组记录链表中已出现的数值,从而只需对链表进行 一趟扫描。 因为 |data| ≤n,故辅助数组 q 的大小为 n+1,各元素的初值均为 0。依次扫描链表中的各结点,同 时检查 q[|data|]的值,如果为 0,则保留该结点,并令 q[|data|]...

1 )算法的基本设计思想 算法的核心思想是用空间换时间。使用辅助数组记录链表中已出现的数值,从而只需对链表进行 一趟扫描。 因为 |data| ≤n,故辅助数组 q 的大小为 n+1,各元素的初值均为 0。依次扫描链表中的各结点,同 时检查 q[|data|]的值,如果为 0,则保留该结点,并令 q[|data|]=1;否则,将该结点从链表中删除。

  
  1. typedef struct node{
  2. int data;
  3. struct node *link;
  4. }NODE;
  5. typedef NODE *PNODE;
  6. void func (PNODE h,int n){
  7. PNODE p=h,r;
  8. int *q,m;
  9. q=(int *)malloc(sizeof(int)*(n+1));//申请n+1个位置的辅助空间
  10. for(int i=0;i<n+1;i++) //数组元素初值置为0
  11. *(q+i)=0;
  12. while(p->link!=NULL)
  13. {
  14. m=p->link->data>0?p->link->data:-p->link->data;
  15. if(*(q+m)==0) //判断该结点的data是否已出现过
  16. {
  17. *(q+m)=1; //首次出现
  18. p=p->link; //保留
  19. }
  20. else{ //重复出现
  21. r=p->link; //删除
  22. p->link=r->link;
  23. free(r);
  24. }
  25. }
  26. free(q);
  27. }
算法的时间复杂度为 O(m) ,空间复杂度为 O(n)

文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。

原文链接:andyguo.blog.csdn.net/article/details/103414802

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。