1.线性表
所谓线性表,就是多个相同数据类型元素逻辑上呈直线排列,逻辑上连续,物理上不一定连续,我们把这种结构称为线性表
常见的线性表有:数组(顺序表)、链表、栈、队列、字符串
逻辑连续:1号元素位于2号元素之前,2号元素位于一号元素之后,这种先后顺序指的是逻辑上的先后,物理上不一定连续
2.动态数组
定义:在普通数组上增加了一个可以根据元素的个数动态调整数组大小的功能
Java中提供的数组都是静态数组int[] long[] char[] (定义之后无法修改长度)
需要我们定义一个类,扩展基础数组的功能
private int[] data;
private int size;
public class Test {
private int[] data;
private int size;
}
若当前data数组已经满了,我们就给它”扩容”-> 使用Arrays.copyOf(old arr,arr.length)扩容
使用Arrays.copyOf(old,arr.length)就能把旧数组的所有内容都搬移到新数组,新数组长度为规定长度
public void grow(){
this.data= Arrays.copyOf(data,data.length*2);
}
public String toString(){
String str = "[";
for (int i = 0; i < size; i++) {
str+=data[i];
if (i!=size-1){
str=str+",";
}
}
str=str+"]";
return str;
}
只要是数据结构无外乎增删改查
数据结构核心就是用于存储数据,操作数据
增加元素
1.add(int val):向当前的动态数组的末尾添加元素
public void add(int val){
data[size]=val;
size++;
if (size==data.length){
grow();
}
}
2.addIndex(int index,int val):向当前动态数组中index的索引位置插入元素val
public void addIndex(int index,int val){
if (index<0||index>size){
System.err.println("add index illegal");
return;
}
for (int i = size-1; i >=index ; i--) {
data[i+1]=data[i];
}
data[index]=val;
size++;
if (size==data.length){
grow();
}
}
查询元素
1.public int getByValue(int val)查询当前动态数组第一个值为val的元素,返回索引
public int getByValue(int val){
for (int i = 0; i < size; i++) {
if (data[i]==val){
return i;
}
}
return -1;
}
2.public boolean contains(int val):查询当前动态数组中是否包含值为val的元素,若存在返回true,否则返回false
public boolean contains(int val){
for (int i = 0; i < size; i++) {
if (data[i]==val){
return true;
}
}
return false;
}
3.public int get(int index):查询当前动态数组中索引为index的元素值
public int get(int index){
if (index>size-1||index<0){
System.out.println("add index illegal");
return -1;
}
return data[index];
}
修改元素
1.public int set (int index,int newVal):修改index位置的元素为新的值newVal,返回修改前的值
public int set(int index,int newVal){
if (index>size||index<0){
System.out.println("set index illegal");
return -1;
}
int oldVal = data[index];
data[index] = newVal;
return oldVal;
}
2.public boolean set(int oldVal,int newVal):修改第一个值为oldVal的元素,更改为新的元素newVal,返回是否修改成功
public int remove(int index){
int oldVal = data[index];
for (int i = index; i <size-1 ; i++) {
data[i]=data[i+1];
}
size--;
return oldVal;
}
删除元素
1.public int remove(int index):删除索引为index对应的元素,返回删除前的元素
public int remove(int index){
int oldVal = data[index];
for (int i = index; i <size-1 ; i++) {
data[i]=data[i+1];
}
size--;
return oldVal;
}
2.public int removeFirst():删除数组的头元素
public int removeFirst(){
return remove(0);
}
3.public int removeLast():删除数组最后一个元素
public int removeLast(){
return remove(size-1);
}
3.public boolean removeByValueOnce(int val):删除一个值为val的元素,返回是否删除成功
public boolean removeByValueOnce(int val){
for (int i = 0; i < size; i++) {
if (data[i]==val){
for (int j = i; j <size-1 ; j++) {
data[i]=data[i+1];
}
size--;
return true;
}
}
return false;
}