删除顺序表中所有值为x的元素(保持删除后元素相对位置不变)

/*
问题描述:删除顺序表中所有值为x的元素(保持删除后元素相对位置不变)
说明:遇到这个题,我首先想到的就是最普通的方法,也是效率最低的方法
(当然,后来凭我一己之力也没想到其他方法)。不过,我看了王道考研复习
资料上又有两种好方法,确实比我的要好,思维方式就和我的不一样。(我的
应该算是最普通、大众的吧,嘿嘿)。
简要解释如下:

test_delete_1:最普通的方法,就是按顺序遍历表L,如果发现x则将后面所有的
元素前移。这样的做法,时间复杂度为O(N2)。

test_delete_2:这种方法的思路是,记录L中x的个数,那么每个x后面的元素只要
向前移动它前面总共的x的数量即可。时间复杂度为O(N)

test_delete_3:这种方式用的是反向的思路,即研究最终的结果,对于最终的结果
来看(即删除所有x后),某个元素应该处于哪个位置。比如说1,2,5,3,4 ,x
为5,那么就最终结果看,1在第一个位置,2在第二个位置,3在第三个 位置,4在第
四个位置,把它们放在数组中对应的位置即可 这种方式的时间复杂度也是O(N)。

总结:上面的第三中思路,是一种逆向思维。这在以后的算法学习中,经常能遇得到。

*/


//删除重复元素1
void test_delete_1(int x,Sqlist &L)
{
    for(int i = 0;i<L.length;++i)
    {
        if(x == L.data[i])  //查找待删除元素
        {
            for(int j = i;j<L.length;++j)    //向前移动元素
            {
                L.data[j] = L.data[j+1];
            }
            --L.length;
            --i;
        }
    }
}
//删除重复元素2
void test_delete_2(int x,Sqlist &L)
{
    int num_x = 0;      //用来记录待删除元素的个数
    for(int i = 0;i<L.length;++i)
    {
        if(L.data[i] == x)
            ++num_x;
        else
            L.data[i-num_x] = L.data[i];    //每个元素向前移动num_x个位置
    }

    L.length = L.length-num_x;      //改变元素个数

}
//删除重复元素3
void test_delete_3(int x,Sqlist &L)
{
    int not_x_num = 0;  //用来记录不等于x的数量

    for(int i = 0;i<L.length;++i)
    {
        if(x != L.data[i])  //当x不等于待测元素时
        {
             L.data[not_x_num] = L.data[i]; //将当前不是x的元素移到第not_x_num个位置上
             ++not_x_num;
        }

    }
     L.length = not_x_num;      //改变元素个数
}
  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值