1.问题描述
顺序表的插入和删除是数据结构中比较基础的,在插入部分要能够做到在数组头部插入数据,在尾部插入数据,以及在指定位置插入指定数据。在删除部分要能够做到删除尾部数据,删除头部数据,删除指定位置的数据。
2.问题分析
在对象中设置一个属性size来表示数组中数据的长度,同时自然也少不了一个属性是数组。一般来将,给数组尾部插入一个数据或者删除数组尾部的数据比较简单。
1)首先来看头插法
可以看到,这些从后向前依次向后移动,有圆圈的范围为【size-1,0】
没有圆圈的范围是【size,1】
代码展示为
public void pushFront(int e)
{
for(int i=size;i>=1;i--)
{
array[i]=array[i-1];
}
array[0]=e;
size++;
}
2)再来看给固定位置插入指定的数
从图中可以看出,这些数从index处开始前向后依次往后移,有圆圈的范围是【index,size-1】,没圆圈的范围为【index+1,size】。
代码展示为
public void insert(int index,int e)
{
for(int i=size;i>=(index+1);i--)
{
array[i]=array[i-1];
}
array[index]=e;
size++;
}
3)删除头部的数
这些数从前往后依次向前移,有圆圈的范围为【1,size-1】,没有圆圈的范围为【0,size-2】
public void popFront()
{
if (size <= 0) {
System.err.println("顺序表为空");
}
for(int i=0;i<=size-2;i++)
{
array[i]=array[i+1];
}
array[--size]=0;
}
4)删除指定位置的数
这些数从index位置开始从前向后依次向前移动,有圆圈的范围是【index+1,size-1】,没有圆圈的范围是【index,size-2】
public void delete(int index)
{
if (size <= 0) {
System.err.println("顺序表为空");
}
for(int i=index;i<=size-2;i++)
{
array[i]=array[i+1];
}
array[--size]=0;
}
注意: 这里还有一个问题就是当数组长度不够存放插进来的数据时,要对数组进行扩容,进行扩容时,一般为原来数组的1.5/2倍,要根据实际情况来判断,进行扩容代码如下:
public void ensureCapacity() {
if (size < array.length) { //当数据长度大于或者等于数组长度时,进行扩容
return; //如果数组中数据的长度比数组长度小,则不需要进行扩容
}
int newCapacity = array.length * 2;
int[] newArray = new int[newCapacity];
for (int i = 0; i < size; i++) {
newArray[i] = array[i];
}
array = newArray;//如果数据长度大于或者等于数组长度时,需要创建一个新对象。
}
接下来就是代码:
class myArrayList{
private int[] array;
private int size;
public myArrayList()
{
array=new int[2];
size=0;
}
public void ensureCapacity() {
if (size > array.length) {
int newCapacity = array.length * 2;
int[] newArray = new int[newCapacity];
for (int i = 0; i < size; i++) {
newArray[i] = array[i];
}
array = newArray;
}
else
return;
}
public void pushBack(int e)
{
ensureCapacity();
array[size++]=e;
}
public void pushFront(int e)
{
ensureCapacity();
for(int i=size;i>=1;i--)
{
array[i]=array[i-1];
}
array[0]=e;
size++;
}
public void insert(int index,int e)
{
ensureCapacity();
for(int i=size;i>=(index+1);i--)
{
array[i]=array[i-1];
}
array[index]=e;
size++;
}
public void popBack()
{
if (size <= 0) {
System.err.println(" 二狗子,顺序表是空的'');
}
array[size-1]=0;
size=size-1;
}
public void popFront()
{
if (size <= 0) {
System.err.println("二狗子,顺序表是空的");
}
for(int i=0;i<=size-2;i++)
{
array[i]=array[i+1];
}
array[size-1]=0;
size=size-1;
}
public void delete(int index)
{
if (size <= 0) {
System.err.println("二狗子,顺序表是空的");
}
for(int i=index;i<=size-2;i++)
{
array[i]=array[i+1];
}
array[size-1]=0;
size=size-1;
}
public void to ()
{
for(int i=0;i<array.length;i++)
{
System.out.print(array[i]);
}
}
public static void main(String[] args)
{
myArrayList a=new myArrayList();
a.pushBack(1);
a.pushBack(2);
a.pushBack(3);// 1 2 3
a.pushFront(2);// 2 1 2 3
a.insert(1, 6);// 2 6 1 2 3
a.to();
System.out.println();
a.popBack();// 2 6 1 2
a.popFront();// 6 1 2
a.delete(1);// 6 2
a.to();
}
}
代码截图如下: