-
- 1. 概念及结构
-
2. 接口实现
-
3. 增、删、改、查的时间复杂度
-
三、总结
线性表是 n 个具有相同特性的数据元素的有限序列。
常见的线性表有:
顺序表、链表、栈、队列、字符串
线性表的逻辑是线性结构,也就是连续的一条线。但是物理结构并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储,例如
1. 概念及结构
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况采用数组存储
那既然顺序表用数组存储为什么不直接使用数组呢?顺序表和数组是同一个东西吗?我们可以思考一下我们如何求一个数组和一个顺序表的实际使用大小呢?
- 对于数组: 好像有点麻烦,因为我们很难以什么条件去判断最后一个实际使用的数组的位置
- 对于顺序表: 我们可以存一个计数一个,哈哈哈,这样一看其实数组和顺序表是不一样的
那么一个简单的顺序表是怎样构成的呢?
我们应该有数组去存储,有这个数组的总容量,有数组中实际使用的值
换做代码就是
publuc class MyArrayList{
// 存储数据的数组
public int[] elem;
// 数组的总容量
public static int capacity = 10;
// 数组实际使用大小
public int usedSize;
public MyArrayList(){
this.elem = new int[capacity];
}
}
2. 接口实现
而了解了顺序表的结构后,我们要自己来实现以下接口去更加方便的实现一些内容
- 判断顺序表是否已满
public boolean isFull(){
return this.usedSize == capacity;
}
- 在 pos 位置新增元素
public void add(int pos, int data){
if(pos<0 || pos>this.usedSize){
System.out.println(“pos 位置不合法”);
return;
}
if(isFull()){
// 扩容
this.elem=Arrays.copyOf(this.elem, 2*capacity);
capacity*=2;
}
for(int i = this.usedSize;i>pos;i–){
this.elem[i]=this.elem[i-1];
}
this.elem[pos]=data;
this.usedSize++;
}
- 打印顺序表
public void display(){
for(int i=0;i<this.usedSize;i++){
System.out.print(this.elem[i]+" ");
}
}
- 判断顺序表是否为空
public boolean isEmpty(){
return this.usedSize==0;
}
- 判断是否包含某个元素
public boolean contains(int toFind){
if(isEmpty()){
return false;
}
for(int i=0;i<this.usedSize;i++){
if(this.elem[i]==toFind){
return true;
}
}
return false;
}
- 查找某个元素的第一次出现的位置
public int search(int toFind){
if(isEmpty())
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
{
return -1;
}
for(int i=0;i<this.usedSize;i++){
if(this.elem[i]==toFind){
return i;
}
}
return -1;
}
- 获取 pos 位置的元素
public int getPos(int pos){
if(isEmpty()){
return -1;
// throw new RuntimeException(“顺序表为空”);
}
if(pos<0 || pos>=this.usedSize){
throw new RuntimeException(“顺序不合法”);
}
return this.elem[pos];
}
- 其实上述代码返回 -1 其实是不一定的,因为在已知该数组不可能等于-1的情况下,我们可以这样处理,但是如果能等于-1.就是错的,就需要换其他值(这相当于具体情况对业务进行处理)
- 也可以使用注释里的
throw new RuntimeException("顺序表为空");
,这其实是手打抛出错误(异常)
- 获取顺序表长度
public int size(){
return this.usedSize;
}