目录
线性表
线性表在逻辑上连续,在内存中不一定连续。
线性表是最基本,最简单的,也是最常用的一种数据结构,一个线性表是n个具有相同特征的数据元素的有限序列。
1 | 3 | 3 | 5 | 8 | 9 |
我们称如果A元素在B元素的前面,称A为B的前驱元素。
我们称如果B元素在A元素的后面,称B为A的后驱元素。
线性表的特征:数据元素之间呈现1对1的关系
1.第一个元素没有前驱,这一个元素称为头结点。
2.最后一个元素没有后继,这一个元素称为尾结点。
3.除了第一个元素和最后一个元素,其他元素有且只有一个前驱和后继元素。
线性表的分类:线性表中数据的存储方式可以是顺序存储,也可以是链式存储。
根据此,将线性表称之为顺序表和链表。
顺序表
将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构是顺序结构。(数组)
1.定义一个顺序表
定义一个数组和一个变量来记录数组中存放数据的个数
class SqeList{
int []arr=new int[10];//顺序表长度10
int n;//被使用的数组长度
}
public class text {
public static void main(String[] args) {
SqeList sqeList=new SqeList();
}
}
2.打印顺序表内容
public void print (){
for(int i=0;i<n;i++){
System.out.print(arr[i]+" ");
}
}
3.增加元素
在指定下标pos中加入元素target
- 下标要求:合法插入位置pos>=0 &&pos<=n
1 | 3 | 7 | 9 | 0 | 7 |
- 数组满了的问题:数组满了,那么n=数组长度,这时候要进行扩容
- 插入元素
//在指定下标pos中加入元素target
public void add(int pos, int target) {
if (n == arr.length) {//数组容量不足,扩容
arr = Arrays.copyOf(arr, arr.length * 2);
}
if (pos < 0 || pos > n) {//下标位置要合法 >=0&&<=n
System.out.println("插入下标位置不合法");
return;
}
else {
for (int i = n; i > pos; i--) {
arr[i] = arr[i - 1];
}
arr[pos] = target;
n++;
}
}
4.是否包含某个元素
public boolean contains(int find){
for (int i = 0; i <n ; i++) {
if(arr[i]==find)
return true;
}
return false;
}
5.查找元素的下标
public int search(int find){
for (int i = 0; i <n ; i++) {
if (arr[i] == find)
return i;
}
return -1;
}
6.得到某一下标位置的元素
public int getPosition(int pos){
if(pos<0||pos>=n){
System.out.println("查找下标不正确");
return -1;//不安全正确
}
else {
return arr[pos];
}
}
7.将某一个下标的元素值更改
public void set(int pos,int target) {
if (pos < 0 || pos >= n) {
System.out.println("下标不正确");
return;
} else {
arr[pos] = target;
}
}
8.删除元素
删除第一次出现的元素
public boolean isEmpty(){
if(n==0)
return true;
return false;
}
public void delate(int target) {
if(isEmpty()==true){
System.out.println("顺序表为空");
return ;
}
int pos = search(target);
if(pos==-1){
System.out.println("元素不存在");
return ;
}
for(int i=pos;i<n-1;i++){
arr[i]=arr[i+1];
}
n--;
}
删除某一下标的元素
public void delateByPos(int pos){
if(isEmpty()==true){
System.out.println("顺序表为空");
return ;
}
if(pos<0 ||pos>=n){
System.out.println("下标不正确");
return ;
}
else{
for(int i=pos;i<n-1;i++){
arr[i]=arr[i+1];
}
n--;
}
}
顺序表分析
- 可以动态增长的数组。
- 数据在内存之中的元素必须是连续的
- 缺点:中间和头部的插入删除很慢。复杂度:O(N)
- 空间不够时,重新分布空间会有内存损耗
- 优点:随机访问,缓存利用率高。