王道课后习题2.3.23:链表中保留第一次出现的结点删除其余绝对值相等的结点

题目描述:

链表中保留第一次出现的结点删除其余绝对值相等的结点

算法思想:

1.暴力。2.辅助数组

核心代码:

/*

L->21->-15->15->-7->15

r
L->NULL

p
21->-15->15->-7->15
*/
//这个方法是把头结点摘掉,依次把符合题目要求的结点插入L中。
//每次插入都遍历一下L表,看看当前要插入的结点是否与L中的结点有绝对值相同的情况,有就不插入
void del(LNode* &L)
{
//    LNode *p=(LNode*)malloc(sizeof(LNode));
//    p=L->next;
    LNode *p=L->next;
    L->next=NULL;
    LNode *r=L;
    bool flag=true;
    while(p!=NULL)
    {
        LNode* r_p=p->next;
        LNode* q=L->next;//q如果是空怎么办
        while(q!=NULL)
        {
            flag=true;
            if(p->data==q->data||p->data==-(q->data))
            {
                flag=false;
                break;//直接break还是会进行插入元素操作
            }
            q=q->next;
        }
        if(flag==true)
        {
            r->next=p;
            r=r->next;
            r->next=NULL;//忘记这句,前面遍历while(q!=NULL)的时候就会出问题
            //但是这句令p->next=NULL了
        }
        //p=p->next;
        p=r_p;//不能是p=p->next,上面的if语句会把p->next的指向操作掉

    }
    r->next=NULL;

}
/*   preq
      p  q
  L->21->21->15->21->15
   p  preq q
L->21->15->21->15
   p  preq q
L->21->15->15

看看后序链表有没有与当前结点P->data绝对值相等的值
*/
void del_2(LNode* &L)
{
    LNode *p,*q,*preq;
    p=L->next;

    while(p!=NULL)
    {
        preq=p;
        q=p->next;
        while(q!=NULL)
        {
            if(p->data==q->data||p->data==-(q->data))
            {
                LNode* temp=q;
                preq->next=q->next;
                q=q->next;
                free(temp);
            }
            else//忘记加这个else了
            {
                preq=q;
                q=q->next;
            }
        }
        p=p->next;
    }

}
//这个是答案给的以空间换时间的方法。使用辅助数组记录链表中已出现的数值,只进行一趟扫描
void del_3(LNode* &L,int n)
{
    int *q=(int*)malloc((n+1)*sizeof(int));
    for(int i=0;i<n+1;i++)
    {
        q[i]=0;
    }
    LNode* pre=L;
    LNode* p=L->next;
    while(p!=NULL)
    {
        int m=p->data;
        if(q[m]==0)//首次出现
        {
            q[m]=1;//没加这个
            pre=p;
            p=p->next;
        }
        else
        {
            LNode* temp=p;
            pre->next=p->next;
            p=pre->next;
            free(temp);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值