1 package com.berry.algorithm.linkedlist;
2
3 /**
4 * 链式存储结构的实现
5 */
6 public class LinkedListArray {
7
8 private LinkedListElement element = null;
9
10 /**
11 *
12 * @param value
13 * 在链的末端插入一个元素
14 */
15 public synchronized void create(int value){
16
17 if(this.element == null){
18 this.element = new LinkedListElement(value);
19 }else{
20 LinkedListElement temp = this.element;
21 LinkedListElement last = null;
22 do{
23 last = temp;
24 temp = temp.next;
25 }while(temp != null);
26
27 last.next = new LinkedListElement(value);
28 }
29 }
30
31 /**
32 *
33 * @param value
34 * @param index
35 * 在链的指定位置插入一个元素
36 */
37 public synchronized void create(int value, int index){
38
39 if(this.element == null || index < 0){
40 return;
41 }
42
43 if(index == 0){
44 LinkedListElement newElement = new LinkedListElement(value);
45 newElement.next = this.element;
46 this.element = newElement;
47 return;
48 }
49
50 LinkedListElement temp = this.element.next;
51 LinkedListElement last = this.element;
52 int i = 1;
53
54 if(temp == null){
55 this.element.next = new LinkedListElement(value);
56 return;
57 }
58
59 while(temp != null){
60
61 if(i == index){
62 LinkedListElement newElement = new LinkedListElement(value);
63 newElement.next = temp;
64 last.next = newElement;
65 return;
66 }else{
67 last = temp;
68 temp = temp.next;
69 i++;
70 }
71 }
72
73 if(index >= i){
74 last.next = new LinkedListElement(value);
75 }
76 }
77
78 /**
79 *
80 * @param value
81 * 在链的末端插入n个元素,元素通过数组的方式传参
82 */
83 public synchronized void create(int[] value){
84
85 if(value == null || value.length == 0){
86 return;
87 }
88
89 if(this.element == null){
90
91 this.element = new LinkedListElement(value[0]);
92 LinkedListElement temp = this.element;
93 for(int i = 1;i < value.length;i++){
94 temp.next = new LinkedListElement(value[i]);
95 temp = temp.next;
96 }
97 }else{
98 LinkedListElement temp = this.element;
99 LinkedListElement last = null;
100 do{
101 last = temp;
102 temp = temp.next;
103 }while(temp != null);
104
105 last.next = new LinkedListElement(value[0]);
106 temp = last.next;
107 for(int i = 1;i < value.length;i++){
108 temp.next = new LinkedListElement(value[i]);
109 temp = temp.next;
110 }
111 }
112 }
113
114 /**
115 *
116 * @param value
117 * @param index
118 * 在链的指定位置插入n个元素,元素通过数组的方式传参
119 */
120 public synchronized void create(int[] value, int index){
121
122 if(this.element == null || index < 0){
123 return;
124 }
125
126 if(index == 0){
127 LinkedListElement newElement = new LinkedListElement(value[0]);
128 LinkedListElement temp = newElement;
129 for(int i = 1;i < value.length;i++){
130 temp.next = new LinkedListElement(value[i]);
131 temp = temp.next;
132 }
133
134 temp.next = this.element;
135 this.element = newElement;
136 return;
137 }
138
139 LinkedListElement temp = this.element.next;
140 LinkedListElement last = this.element;
141 int i = 1;
142
143 if(temp == null){
144 this.element.next = new LinkedListElement(value[0]);
145 temp = this.element.next;
146 for(int k = 1;k < value.length;k++){
147 temp.next = new LinkedListElement(value[k]);
148 temp = temp.next;
149 }
150 return;
151 }
152
153 while(temp != null){
154
155 if(i == index){
156 LinkedListElement newElement = new LinkedListElement(value[0]);
157 last.next = newElement;
158
159 LinkedListElement temp2 = newElement;
160 for(int k = 1;k < value.length;k++){
161 temp2.next = new LinkedListElement(value[k]);
162 temp2 = temp2.next;
163 }
164 temp2.next = temp;
165 return;
166 }else{
167 last = temp;
168 temp = temp.next;
169 i++;
170 }
171 }
172
173 if(index >= i){
174 last.next = new LinkedListElement(value[0]);
175 temp = last.next;
176 for(int j = 1;j < value.length;j++){
177 temp.next = new LinkedListElement(value[j]);
178 temp = temp.next;
179 }
180 }
181 }
182
183 /**
184 *
185 * @param index
186 * 删除指定位置的元素
187 */
188 public synchronized void delete(int index){
189
190 if(this.element == null || index < 0){
191 return;
192 }
193
194 if(index == 0){
195 if(this.element.next != null){
196 this.element = this.element.next;
197 return;
198 }else{
199 this.element = null;
200 return;
201 }
202 }else{
203 LinkedListElement temp = this.element.next;
204 LinkedListElement tempBefore1 = this.element;
205 int i = 1;
206
207 while(temp != null){
208
209 if(i == index){
210 if(temp.next == null){
211 tempBefore1.next = null;
212 break;
213 }else{
214 tempBefore1.next = temp.next;
215 break;
216 }
217 }else{
218 tempBefore1 = temp;
219 temp = temp.next;
220 i++;
221 }
222 }
223 }
224 }
225
226 /**
227 *
228 * @param index
229 * 读取指定位置的元素
230 */
231 public synchronized Integer read(int index){
232
233 if(this.element == null || index < 0){
234 return null;
235 }
236
237 if(index == 0){
238 return this.element.value;
239 }
240
241 LinkedListElement temp = this.element.next;
242 int i = 1;
243
244 while(temp != null){
245 if(i == index){
246 return temp.value;
247 }else{
248 temp = temp.next;
249 i++;
250 }
251 }
252
253 return null;
254 }
255
256 /**
257 *
258 * 获取链的长度
259 */
260 public synchronized int length(){
261
262 if(this.element == null){
263 return 0;
264 }else{
265 int i = 1;
266 LinkedListElement temp = this.element.next;
267 while(temp != null){
268 temp = temp.next;
269 i++;
270 }
271 return i;
272 }
273 }
274
275 /**
276 *
277 * 遍历并打印链的所有元素
278 */
279 public void show(){
280 if(this.element == null){
281 System.out.println("Array hasn't element");
282 }else{
283 LinkedListElement temp = this.element;
284 int i = 0;
285 while(temp != null){
286 System.out.println("element " + i + ": " + temp.value);
287 temp = temp.next;
288 i++;
289 }
290 }
291 }
292
293 /**
294 *
295 * 链的元素类(结构体)
296 */
297 private class LinkedListElement {
298
299 public LinkedListElement next = null;
300
301 public int value;
302
303 public LinkedListElement(int value){
304 this.value = value;
305 }
306 }
307 }