1.问题:自定义链表实现增加元素、获取元素、获取链表长度功能。
2.解决思路:先创建一个自定义链表的类,创建原始数组,定义静态的初始长度为常量,定义实际长度,定义构造函数包含数组长度和实际初始长度。然后定义扩容函数,接着定义两个参数不同的增加元素方法,定义获取元素的方法,最后定义测试类,在main方法中增加元素、获取元素、获取链表长度并输出。
3.难点:
(1)
private static final int DeFault_size = 3;
定义静态的常量,所有成员都可调用该属性。
(2)
System.arraycopy(old_arr,0,new_arr,0,theSize);
该方法的形式为:arraycopy(Object src,int srcPso,Object dest,int destPos,int length),该方法为把一个数组的元素移到另外一个数组中。
其中,src为原始数组;srcPso为原始数组复制的开始元素;dest为目标数组;destPos为复制的开始元素;length为复制元素的个数。
4.代码:
(1)创建一个自定义链表的类,定义属性
import java.util.Arrays;
public class MyArrayList<E> {
private Object[] old_arr;
//定义私有静态的初始长度为常量
private static final int DeFault_size = 3;
//定义私有实际长度
private int theSize;
(2) 定义自定义链表构造函数
public MyArrayList(){
//定义数组长度
this.old_arr = new Object[DeFault_size];
//实际长度初始值为0
theSize = 0;
}
(3)定义扩容函数
public void grow(int grow_size){
//判断是否扩容
if(theSize < grow_size){
//否,返回空值
return;
}
//创建新数组
Object[] new_arr = new Object[theSize * 2 +1];
//运用System类的移值方法,将就数组的元素移到新数组中
System.arraycopy(old_arr,0,new_arr,0,theSize);
//将新数组赋值给就数组,完成扩容
old_arr = new_arr;
}
(4)定义两个增加元素的方法,一个为含长度和数据的方法,另外一个在该方法的基础上出去数据这一参数
public void add(int index,E data){
//判断是否超出范围
if(index < 0 || index > theSize){
//是,抛出数组索引越界异常
throw new ArrayIndexOutOfBoundsException();
}
//添加元素要判断当前的数组是否要扩容
if(theSize == old_arr.length){
//扩容
grow(theSize);
}
for(int i = theSize;i > index;i--){
//元素后移
old_arr[i] = old_arr[i-1];
}
//给数组赋值
old_arr[index] = data;
theSize++;
}
public void add(E data){
//隐藏添加元素位置的属性
add(theSize,data);
}
(5)定义E返回类型的获取元素的方法
public E get(int index){
return (E)(old_arr[index]);
}
(6)定义int返回类型的获取链表长度的方法
public int size(){
return theSize;
}
(7)定义测试类进行调试
public static void main(String[] args) {
MyArrayList<String> list = new MyArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("陈六");
System.out.println(list.get(0));
System.out.println(list.size());
}
5.结果: