1)题目:对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x数据元素
2)思路:
d是元素移动的步长。从前往后依次遍历顺序表,当找到第一个等于x的元素时,d=1,该元素后面的元素都依次往前移动1个位置;当找到第二个等于x的元素时,d=2,该元素后面的元素依次往前移动2步;当找到第n个等于x的元素时,d=n,该元素后面的元素依次往前移动n步;最后顺序表后面空出d的位置,从顺序表最后的位置向前遍历,删掉d个元素即可。
3)代码:
源码中使用到的ArrrayList,是调用的是自己实现的ArrayList,自己实现的ArrayList源码地址:https://blog.csdn.net/u012441545/article/details/89667486
package com.sam.datastruct.arrayList;
import java.util.Random;
public class P2_03 {
public void function(ArrayList<Integer> list, Integer x){
int d = 0;
for(int i = 0; i < list.size(); ++i){
if (i + d < list.size()) {
while (list.get(i + d).equals(x)) {
++d;//元素移动的步长
}
list.update(list.get(i + d), i);
}
}
for(int i = 0; i < d; ++i){
list.remove();
}
}
public static void main(String[] args) {
P2_03 p = new P2_03();
ArrayList<Integer> list = new ArrayList<>();
list.initRamdomList(20);
Random random = new Random();
Integer x = 10;
for (int i = 0; i < 5; i++) {
list.update(x, random.nextInt(19));
}
System.out.println(list.toString());
System.out.println("x: " + x);
p.function(list, x);
System.out.println(list.toString());
}
}