目录
一、线性表
线性表:线性表是n个具有相同特性的数据元素的有限序列,常见的线性表有顺序表、链表、栈、队列、字符串......
线性表在逻辑上是线性结构,也就时说是连续的一条直线。但是在物理结构上并不是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
二、顺序表
顺序表:基于数组的线性表,元素不仅逻辑连续,在物理结构上也连续。
动态数组:根据数组的大小动态调整长度。Java中数组的长度是固定的,声明后只能存放固定长度的数值。
2.1代码分析
2.1.1 扩容
当size==data.length时,表示此时数组已满,需要扩容,使用Arrays.copyOf扩容
2.1.2在数组头部插入元素
2.1.3在数组尾部插入元素
2.1.4在数组任意位置插入元素
2.1.5删除指定索引位置的元素
2.1.6删除数组中所有值为value的元素
三、完整代码
package seqlist;
import java.util.Arrays;
/**
* 基于数组的顺序表
*/
public class MyArray {
// 存储元素仍然还在数组中存储
private int[] data;
// 当前动态数组中实际存储的元素个数
private int size;
//数组总共能存放的元素个数
public MyArray(){
data=new int[10];
}
/**
* 传入数组的大小
* @param capacity
*/
public MyArray(int capacity){
data=new int[capacity];
}
/**
* 在数组头部插入元素
* @param value 待插入的新元素
*/
public void addFirst(int value){
//判断数组是否已满
if(size==data.length){
grow();//扩容
}
//将第一个位置空出来
for (int i = size-1; i >=0; i--) {
data[i+1]=data[i];
}
//将待插入元素插入第一个位置
data[0]=value;
//数组长度加一
size++;
}
/**
* 在数组尾部插入元素
* @param value 待插入的新元素
*/
public void addLast(int value){
//判断数组是否已满
if(size==data.length){
grow();//扩容
}
//将待插入元素插入
data[size]=value;
size++;
}
/**
* 在数组任意位置插入元素
* @param index 传入的索引值
* @param value 待插入的新元素
*/
public void addIndex(int index,int value){
//判断合法性
if(index<0||index>size){
System.err.println("false number!");
return;
}
if(size==data.length){
grow();
}
// 将index位置空出来
for (int i = size-1; i >=index ; i--) {
data[i+1]=data[i];
}
data[index]=value;
size++;
}
/**
* 判断值为value的元素是否存在
* @param value
* @return true or false
*/
public boolean contains(int value){
//遍历数组
for (int i = 0; i < size; i++) {
if(data[i]==value){
return true;
}
}
return false;
}
/**
* 根据索引查询元素
* @param index 索引值
* @return
*/
public int get(int index){
//判断合法性
if(index<0||index>size-1){
System.err.println("get index illegal!");
return -1;
}
return data[index];
}
/**
* 在数组中查找value值对应的索引下标
* @param value
* @return
*/
public int getByValue(int value){
for (int i = 0; i < size; i++) {
if(data[i]==value){
return i;
}
}
// 此时循环走完还没找到元素,value不存在
return -1;
}
/**
* 将指定索引位置元素修改为newValue,返回修改前的元素值
* @param index
* @param newValue
* @return
*/
public int set(int index,int newValue) {
//判断合法性
if(index<0||index>size-1){
System.err.println("set index illegal!");
return -1;
}
int oldValue=data[index];
data[index]=newValue;
return oldValue;
}
//头删
public void removeFirst(){
removeIndex(0);
}
//尾删
public void removeLast(){
removeIndex(size-1);
}
/**
* 删除指定索引位置的元素
* @param index
*/
public void removeIndex(int index){
if(index<0||index>size-1){
System.err.println("remove index illegal!");
return;
}
for (int i = index; i <size-1 ; i++) {
data[i]=data[i+1];
}
size--;
data[size]=0;
}
/**
* 删除数组中第一个元素值为value的元素
* @param value
*/
public void removeValueOnce(int value){
for (int i = 0; i < size; i++) {
if(data[i]==value){
removeIndex(i);
return;
}
}
}
/**
* 删除数组中所有值为value的元素
* @param value
*/
public void removeAllValue(int value){
for (int i = 0; i < size; i++) {
while(i!=size&&data[i]==value){
removeIndex(i);
}
}
}
public String toString(){
String ret="[";
for (int i = 0; i <size; i++) {
ret+=data[i];
if(i!=size-1){
ret+=",";
}
}
ret+="]";
return ret;
}
/**
* 扩容
*/
public void grow(){
int[] newData= Arrays.copyOf(this.data,this.data.length<<1);
this.data=newData;
}
}