2015 删掉绝对值相同节点

思想:以空间换时间,因为|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)

posted @ 2019-10-20 14:42  bestAndBest  阅读(436)  评论(0)    收藏  举报