顺序表其实就是我们所熟悉的数组,擅长随机访问,给定位置能够高效的获取/修改指定位置的值,时间复杂度为O(1),但按值查找、插入、删除等时间复杂度均为O(n)。对于尾插和尾删,时间复杂度为O(1)。
SeqList的实现:
package SeqList;
public class SeqList {
//数组最大容量为10,但这10个元素不一定都是有效元素
private int[] data = new int[10];
//表示数组当前有效元素个数
private int size = 0;
//打印
public void display() {
System.out.print("[");
for(int i=0;i<size;i++) {
System.out.print(data[i]);
if(i != size-1) {
System.out.print(",");
}
}
System.out.println("]");
}
//增加元素
//pos为放在哪个下标,elem为插入哪个元素
public void add(int pos,int elem) {
//pos无效
if(pos < 0 || pos > size) {
return;
}
if(this.size >= this.data.length) {
//容量不够,需扩容
//申请一块更大的内存,再把原有数据拷贝过去
realloc();
}
//pos == size 相当于尾插
if(pos == size) {
this.data[pos] = elem;
this.size++;
return;
}
//在中间位置插入,要进行搬运
for(int i = this.size; i > pos; i--) {
this.data[i]=this.data[i-1];
}
this.data[pos] = elem;
this.size++;
}
//扩容
private void realloc() {
//根据实际场景来选择是线性增长还是指数增长,亦或其它方式
//扩容是比较大的开销
int[] newData = new int[this.data.length*2];
for(int i=0; i<this.data.length;i++) {
newData[i]=this.data[i];
}
this.data = newData;
}
//判断元素是否存在
public boolean contains(int toFind) {
for(int i=0;i<this.size;i++) {
if(this.data[i] == toFind) {
return true;
}
}
return false;
}
//查找元素
public int search(int toFind) {
for(int i=0;i<this.size;i++) {
if(this.data[i] == toFind) {
return i;
}
}
return -1;
}
//获取pos位置
public int getPos(int pos) {
return this.data[pos];
}
public void setPos(int pos,int elem) {
this.data[pos] = elem;
}
//删除第一次出现的值为key的元素
public void remove(int toRemove) {
int pos = search(toRemove);
if(pos == -1) {
//该值不存在,不必删除
return;
}
if(pos == this.size-1) {
//如果是最后一个元素,直接size--
this.size--;
return;
}
//普通位置的删除,也需搬运
for (int i = pos; i < size-1; i++) {
this.data[i] = this.data[i+1];
}
this.size--;
}
//求长度
public int size() {
return size;
}
//清空
public void clear() {
this.size = 0;
//缩容
this.data = new int[10];
}
}
Test测试类:
package SeqList;
public class Test {
public static void main(String[] args) {
TestAdd();
TestContians();
TestSearch();
TestRemove();
}
public static void TestAdd() {
System.out.println("测试添加:");
SeqList seqList = new SeqList();
seqList.add(0, 1);
seqList.add(1, 2);
seqList.add(2, 3);
seqList.add(3, 4);
seqList.add(2, 5);
seqList.display();
}
public static void TestContians() {
System.out.println("测试contians方法:");
SeqList seqList = new SeqList();
seqList.add(0, 1);
seqList.add(1, 2);
seqList.add(2, 3);
seqList.add(3, 4);
boolean ret = seqList.contains(2);
System.out.println("ret预期是true,实际是:"+ret);
}
public static void TestSearch() {
System.out.println("测试search方法:");
SeqList seqList = new SeqList();
seqList.add(0, 1);
seqList.add(1, 2);
seqList.add(2, 3);
seqList.add(3, 4);
int ret = seqList.search(3);
System.out.println("ret预期是2,实际是:"+ret);
}
public static void TestRemove() {
System.out.println("测试remove方法:");
SeqList seqList = new SeqList();
seqList.add(0, 1);
seqList.add(1, 2);
seqList.add(2, 3);
seqList.add(3, 4);
seqList.remove(3);
System.out.print("预期是:[1,2,4],实际是:");
seqList.display();
}
}
运行结果: