链表是数据结构中最基础的内容,链表在存储结构上分成两种:数组形式储存,链式存储。
相比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 }
数据结构(一点五)链式顺序表