思想:以空间换时间,因为|data|<=n,故辅助数组长度为n+1,各元素初值为0,依次扫描链表中各节点,同时检查q[|data|]的值如果为0,则保留该节点,幷使数值为1,否则,删除该节点。
代码:
void func(PNODE h,int n) { PNODE p,h,r; int *q,m; q=(int *)malloc(sizeof(int)*n+1); for(int i=0;i<n+1;++i) *(q+i)=0; while(p->next!=NULL) { m=p->next->data>0?p->next->data:-p->next->data; if(*(q+m)==0)//首次出现 { *(q+m)=1; p=p->next; } else{ //重复出现则删除 r=p->next; p->next=r->next; free(r); } } free(q); }
时间O(1),空间O(n)
原文:https://www.cnblogs.com/yangmenda/p/11707568.html