文章目录
一.循序表和链表
1.线性表
线性表是n个具有相同元素的有限序列,线性表是一种实际中广泛使用的数据结构,常见的线性链表:循序表(数组),链表,栈,队列,字符串。也就是多个相同数据类型的元素逻辑上呈直线排列,逻辑上连续。
逻辑连续:1号元素在2号元素之前,2号元素在1号元素之后,这种先后循序指的逻辑上的先后,物理上不一定连续(存储时,不一定就是1在2的前面,不是连续存储),比如链表。
2.单链表
单链表->火车
火车的不同车厢之间都是通过挂钩连接的,当这两个车厢脱轨后,这两个车厢就没有任何关系了。
不想数组,相邻的两个元素不仅逻辑连续,物理也连续。
假设每个火车车厢只保存一个整型值,这个值就是我们要存储的数组,每节车厢还要保存一个下一节车厢的地址。
所谓的单链表指的是,只能从头节点开始走从前走到后,每个节点只保存了下一个节点的地址,只能一个方向遍历。
节点类如何定义:每节火车的车厢
Node类表示的是每个火车节点,每个链表的节点。
啥是链表:由若干个链表节点构成的对象称为链表
class Node{
int val;//当前节点保存的值
Node next;//下一个节点的地址
}
class SingleLineList{
Node head;//头节
int size;//当前链表中的结点个数
}
2.1链表的头插法
每次新增一个节点就要创建一个Node类的对象
法一:
法二:
结果:
2.2链表的遍历
从当前节点开始,依次取出每个节点值,然后通过next引用走到下一个节点,直到走到链表的末尾(next = null)
执行结果
2.3链表index插入
在链表index位置插入一个新元素val
add(int index,int val){
}
2.4尾插法
addLast(int val){
add(size val);//复用这个方法即可
}
2.5链表的查询
boolean contains(int val)//是否包含指定点的节点
get(int index)//索引为index的元素值为多少
getByValue//查询第一个值为val的节点索引是多少
2.6链表的修改
set(int index,int newVal)//修改索引为index位置的节点职位为newVal
2.7链表的删除
remove(int index)//删除索引为index的元素
结果:
头删尾删
结果:
删除链表中第一个值为val的元素
结果:
removeAllValue( int val);//删除链表中所有值为val的元素
3.虚拟单链表
3.1插入
虚拟头节点-dummyHead-现实中的火车头-只作为链表的头节点使用,不存储有效数据,链表中的其他有效节点都可以一视同仁,全都有前驱节点。
所有节点的插入删除都是一样的,因为出了头节点都有前驱。
有虚拟头节点之后,所有节点都是该节点的“后继”节点。无论当前是否存在有效元素,我们的插入步骤完全一致。省去了判断头的情况。
在链表的index位置插入节点
3.2删除
prev从虚拟头节点走index步,恰好走到带删除节点的前驱
删除全部val元素
二.动态数组
1.什么是动态数组
我们之前用的数组,最大的问题就在于数组的长度定长,一旦一个数组在定义时确定长度以后,使用过程中无法修改这个长度。
动态数组就是在普通数组上,增加了一个可以根据元素的个数动态调整数据大小的功能。java中提供的数组都是静态数组int[],char[],long[](定义之后没法改变长度),需要我们定义一个类,拓展基础数组的功能
对于用户来说,要存储元素使用MyArray这个类的对象,至于你内部如何存储,我不关心,我只知道调用这个类的方法就可以帮我把元素进行增删改查,至于内部到底咋实现的,我也不关注。
对于程序的设计者来说,咱又不可能真正创建个新的数组,使用的还是java提供的整形数组,若当前的data数组已经满了,我们就给他"扩容"Arrays.copeOf(old,newArrLen); =>就可以把旧数组的所有内容搬移到新数组中,新数组的长度为规定长度。
size这个属性永远是当前有效元素的下一个位置的索引。下一次再存储新的元素的时候,直接使用size对应的索引即可。
2.添加方法
只要是数据结构,无外乎增删改查
数据结构与核心就是来存储数据,操作数据。
增加:1.add(int val)向当前动态数组中添加元素->添加到数组末尾
2.addIndex(int index,int val):向当前的动态数组中index索引位置添加一个新的元素,新元素插入后的索引为index。先从最后一个有效元素开始向后搬移。
for(int i = size-1;i>=index;i–){
data[i+1]=data[i]
}
//index位置就空出来了
data[index]=val;
3.查
1.public int getByValue(int val):查询当前动态数组中第一个值为val的元素索引。
2.public boolean contains(int val):查询当前动态数组中是否包含值为val的元素,若存在返回true,否则返回false
3.pubilc int get(int index):查询当前动态数组中索引为index的元素值
4.修改
1.public int set(int index,int Val):修改index位置的元素为新的值newVal,返回修改前的值。
2.public boolean set(int oldVal,int newVal ):修改第一个值为oldVal的元素,更改为新的值newVal,返回是否修改成功。
5.删除
还是元素搬移,但此时从index+1这个元素开始向前移到,移动到size-1对应的元素值
1.public int remove(int index):删除索引为index对应的元素,返回删除前的元素值。
2.public int removeFirst():删除数组的头元素。
3.public int remove Last():删除数组的尾元素。
4.public boolean removeByValueOnece (int index):删除第一个值为Val的元素,返回是否删除成功。
在这里插入图片描述