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 }