1.概念及结构
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表一般可以分为:
-
静态顺序表:使用定长数组存储。
-
动态顺序表:使用动态开辟的数组存储。
静态顺序表适用于确定知道需要存多少数据的场景. 静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用.
相比之下动态顺序表更灵活, 根据需要动态的分配空间大小.
2.基本操作
定义 SeqList类的成员的属性和方法
private int[] data = new int[10];
// size 表示当前数组中有多少个有效元素
private int size = 0;
1.打印顺序表
public void display() {
// System.out.println(Arrays.toString(data));
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("]");
}
2.在 pos 位置新增元素
// pos 把元素放到哪个下标上. elem 表示插入的元素是啥
// 时间复杂度 O(N) (最坏)
public void add(int pos, int elem) {
// TODO
if(pos>data.length||pos<0){
return;
}
if (size >= data.length) {
realloc();
}
if(pos==size){
data[pos]=elem;
size++;
}else{
for (int i = size; i>pos; i--) {
data[i]=data[i-1];
}
data[pos]=elem;
size++;
}
}
3.判定是否包含某个元素
public boolean contains(int toFind) {
for (int i = 0; i < this.size; i++) { //遍历
if (this.data[i] == toFind) { //判断
return true;
}
}
return false;
}
4.查找某个元素对应的位置
public int search(int toFind) {
for (int i = 0; i < this.size; i++) {
if (this.data[i] == toFind) {
return i;
}
}
return -1;
}
5.获取 pos 位置的元素
public int getPos(int pos) {
if (pos < 0 || pos > this.size) {
return -1;
}
return this.data[pos];
}
6.给 pos 位置的元素设为 value
public void setPos(int pos, int value) {
this.data[pos]=value;
}
7.删除第一次出现的关键字key
//是否存在key值
//若该值为最后一个值时
//删除后key值后面的值往前移填补空位
// 按值删除. 删除第一次出现的值
public void remove(int toRemove) {
int pos = search(toRemove);
if(pos == -1){
return;
}
if(pos == this.size - 1){
this.size--;
return;
}
for(int i = pos; i < this.size - 1; i++){
this.data[i] = this.data[i + 1];
}
this.size--;
}
8.获取顺序表长度
public int size() {
return this.size;
}
9.清空顺序表
public void clear() {
this.size = 0;
this.data = new int[10];
}
10.顺序表扩容为原来的2倍
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;
}