前言
王道2015统考真题
正文
题目
用单链表存储m个整数,要求设计一个时间复杂度尽可能高效的算法,删除链表中的data的绝对值相等的结点,仅保留第一次出现的结点而删除其余绝对值相等的结点。
代码
关键:空间换时间,创建一个数组(初始化0),记录已出现的数值(变成1),从而只进行一趟扫描。
void func(Linklist h,int n){
LNode *p=h,r;
int *q,m;
q=(int *)malloc(sizeof(int)*(n+1));//申请n+1个辅助空间
for(int i=0;i<n+1;i++){
*(q+i)=0;
}
while(p->Link!=NULL){
m=p->link->data>0?p->link->data:p->link->data;//取结点data的绝对值
if(*(q+m)==0){ //判断该结点是否首次出现
*(q+m)=1; //首次出现过
p=p->link; //保留
}
else{ //重复出现删除
r=p->link;
p->link=r->link;
free(r);
}
}
free(q);
}