删除单链表中绝对值重复的元素

本文介绍了一种高效的单链表中绝对值重复元素的删除算法,利用辅助数组实现O(N)的时间复杂度,避免了传统方法的多次遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
问题描述:删除单链表中绝对值重复的元素。如:(21,-15,-15,-7,15)->(21,-15,-7)
说明:其实这题比较好的思路还是以前说的,以空间换时间。还是以前说的分类,把归属于一类的当成一种情况(这里是绝对值相同的元素),看它们能不能有相同的容易被检测到操作,在这里是把辅助数组对应位置加1。这样的话,遍历一遍就可以完成问题,时间复杂度是O(N),普通的算法,来回重复遍历,复杂度是O(N2)。不过还是老问题,这里需要元素的绝对值的最大值不能太大因为这是辅助数组是根据元素绝对值的最大值申请空间的。

*/

//筛选链表中绝对值重复的元素
void FiltrateRep(LinkList &L)
{
    int temp[MAXSIZE];      //辅助元素

    memset(temp,0,sizeof(int)*MAXSIZE);     //初始化为0

    LNode *pre = NULL,*p =NULL ;

    pre = L;
    while(pre->next != NULL)
    {
        p = pre->next;

        if( p!= NULL)
        {
             if(temp[abs(p->data)] < 1)
             {
                  ++temp[abs(p->data)];        //辅助数组对应元素位置+1
                  pre = p;
             }
             else       //如果temp[p->data]大于1,正在判断的元素,是重复元素,需要删除
             {
                 pre->next = p->next;   //删除重复的元素

                 delete p;
             }
        }

    }

}

总结:其实以前做顺序结构的线性表的时候,明明总结过这种思路,到这里又没想到,还是不能融会贯通。还得修炼啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值