删除顺序表中所有值为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;ilength;++i)
    {
        if(x == L.data[i])  //查找待删除元素
        {
            for(int j = i;jlength;++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;ilength;++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;ilength;++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;      //改变元素个数
}

你可能感兴趣的:(编程相关,删除元素,顺序表)