数据结构java(一)数组链表

链表是数据结构中最基础的内容,链表在存储结构上分成两种:数组形式储存,链式存储。

相比c语言需要的结构体,在java中由于有了面向对象编程,将指针‘藏’了起来,不需要分配内存。

所以只需要创建一个对象数组,为了能让链表更加实用,方便存储非基本类型的对象,所以使用了泛型。

菱形运算符<>中放你自己写的或者基本类型,比如你创建了一个Stdent类,想用链表将很多学生的信息存起来。

就可以myArrayList<Student> a=new myArrayList();这个链表就都存Student类的对象了。

数组链表的源码:

  1 import java.util.Arrays;
  2 
  3 /**
  4  * @author 李正阳
  5  * @param <E> 泛型:所存储的对象
  6  */
  7 public class myArrayList<E> implements List<E> {
  8     /**
  9      * DEFAULT_SIZE 数组链表储存的最大值
 10      * elementData 存储元素的数组
 11      * capacity当前数组链表可以存储的个数(为了扩容存在)
 12      * size当前链表存储的个数
 13      */
 14     private final int DEFAULT_SIZE = 16;
 15     private Object[] elementData;
 16     private int capacity;
 17     public int size;
 18 
 19     /**
 20      * 初始化数组栈
 21      */
 22     public myArrayList() {
 23         elementData = new Object[DEFAULT_SIZE];
 24         size = 0;
 25         capacity=DEFAULT_SIZE;
 26     }
 27 
 28     /**
 29      * 在数组链表的最后添加元素
 30      * @param data 添加的元素
 31      * @return true 添加成功 false 添加失败
 32      */
 33     @Override
 34     public boolean add(E data) {
 35         if(isFull()) {
 36             relloc();
 37             elementData[size] = data;
 38             size++;
 39         }else {
 40             elementData[size] = data;
 41             size++;
 42         }
 43         return true;
 44     }
 45 
 46     /**
 47      * 判满函数
 48      * @return true 满 false 未满
 49      */
 50     @Override
 51     public boolean isFull() {
 52         if (size == DEFAULT_SIZE-1) {
 53             return true;
 54         } else {
 55             return false;
 56         }
 57     }
 58     /**
 59      * 判空函数
 60      * @return true 空 false 未空
 61      */
 62     @Override
 63     public boolean isEmpty() {
 64         if (size ==0) {
 65             return true;
 66         } else {
 67             return false;
 68         }
 69     }
 70 
 71     /**
 72      * 删除元素
 73      * @param number 删除元素在数组中的位置
 74      * @return
 75      */
 76     @Override
 77     public E remove(int number){
 78 
 79             E temp;
 80             if (number == size) {
 81                 temp = (E) elementData[size - 1];
 82                 size--;
 83             } else if(number<size) {
 84                 temp = (E) elementData[number - 1];
 85                 for (int i = number; i < size; i++) {
 86                     elementData[i] = elementData[i + 1];
 87                 }
 88                 size--;
 89             }else {
 90                 throw new ArrayIndexOutOfBoundsException();
 91             }
 92             return temp;
 93 
 94     }
 95 
 96     /**
 97      * 删除数组最后的元素
 98      * @return 删除那个元素
 99      */
100     @Override
101     public E remove(){
102         E temp;
103         temp = (E) elementData[size-1];
104         size--;
105         return temp;
106     }
107 
108     /**
109      * 设置某一个位置元素
110      * @param i 在数组的位置
111      * @param data 替换的元素
112      */
113     @Override
114     public void set(int i,E data){
115         if(i<=size) {
116             elementData[i - 1] = data;
117         }else {
118             throw new ArrayIndexOutOfBoundsException();
119         }
120     }
121 
122     /**
123      * 取得数组中某个位置的元素
124      * @param i 数组的位置
125      * @return 这个位置的对象
126      */
127     @Override
128     public E get(int i){
129         E temp;
130         if(i<=size) {
131              temp = (E) elementData[i - 1];
132             return temp;
133         }else {
134             throw new ArrayIndexOutOfBoundsException();
135         }
136     }
137 
138     /**
139      * 判断一条链表是否为回文
140      * @return false 否 true 是
141      */
142     @Override
143     public boolean isPalindrome() {
144         if(!isEmpty()) {
145             for (int i = 0, j = size - 1; i < size - 1; i++, j--) {
146                 if (String.valueOf(elementData[i]).equals(String.valueOf(elementData[j]))) {
147                 } else {
148                     return false;
149                 }
150             }
151             return true;
152         }else {
153            throw new NullPointerException();
154         }
155     }
156 
157     /**
158      * 输出链表中所有元素
159      */
160     @Override
161     public void traver() {
162         for (int i=0;i<size;i++){
163             System.out.print(elementData[i]+" ");
164         }
165     }
166 
167     /**
168      * 扩容将数组扩容为两倍
169      */
170     private void relloc(){
171         capacity=DEFAULT_SIZE*2;
172         elementData=Arrays.copyOf(elementData,DEFAULT_SIZE*2);
173     }
174 }

List接口:

 1 /**
 2  * @author 李正阳 
 3  * @param <E> 泛型
 4  */
 5 public interface List<E> {
 6     public boolean add(E data) ;
 7 
 8     /**
 9      * 链式不需要这个方法
10      */
11     default boolean isFull() {
12         return false;
13     }
14     public boolean isEmpty() ;
15     public E remove(int number);
16     public E remove();
17     public void set(int i,E data);
18     public E get(int i);
19     public boolean isPalindrome();
20     public void traver();
21 }

猜你喜欢

转载自www.cnblogs.com/lzy321/p/10363697.html