自我理解java linkedlist插入數(shù)據(jù)的算法:
首先看一下,linkedlist插入源代碼:
1 public class LinkedList
2 extends AbstractSequentialList
3 implements List, Deque, Cloneable, java.io.Serializable
4 {
5 private transient Entry header = new Entry(null, null, null);//初始化時(shí)先實(shí)例一個(gè)header,鏈表頭
6
7
8 /**
9 * Constructs an empty list.//構(gòu)造一個(gè)空鏈表
10 */
11 public LinkedList() {
12 header.next = header.previous = header; //把鏈表頭和尾先連到自己(1)
13 addBefore(e, header);(2)
14
15 }
16
17 
.
18
19 public boolean add(E e) {//插入鏈表方法
20 return true;
21 }
22 
.
23
24 private static class Entry {//每個(gè)數(shù)據(jù)存放,所要用到的靜態(tài)內(nèi)部類
25 E element;
26 Entry next;//后一個(gè)節(jié)點(diǎn)
27 Entry previous;//接一個(gè)節(jié)點(diǎn)
28
29 Entry(E element, Entry next, Entry previous) {
30 this.element = element;
31 this.next = next;
32 this.previous = previous;
33 }
34 }
35
36
37 //插入操作方法
38 private Entry addBefore(E e, Entry entry) {
39 Entry newEntry = new Entry(e, entry, entry.previous);(3)
40 newEntry.previous.next = newEntry;(4)
41 newEntry.next.previous = newEntry;(5)
42 size++;(6)
43 modCount++;
44 return newEntry;
45 }
46
47
48 /*其他方法~~*/
49
50
以上部分就是算法所在:(一個(gè)簡單的公式替換過程)
算法步驟(對應(yīng)上面的編號):
(1)實(shí)例化一個(gè)header (Entry)
header.next = header
header.previous = header
當(dāng)有第一條數(shù)據(jù)插入鏈表:
(3)實(shí)例化一個(gè) Entry newEntry (以下簡稱E1)
E1.next = header
E1.previous = header.previous
E1.previous.next = header.previous.next = header.next
(4)由上面可得:
newEntry.previous.next = newEntry;
作用:
相當(dāng)于 E1.previous.next = header.next = E1
其實(shí)就是,讓上一個(gè)節(jié)的next指向下一個(gè)節(jié)點(diǎn)數(shù)據(jù)
所以header.next 的下一個(gè)節(jié)點(diǎn)就是E1
(5)E1.next.previous = header.previous = E1(這里用得巧妙)
其實(shí)這個(gè)用法單從E1.next.previous= E1單這么看,很直觀因?yàn)镋1的下一個(gè)節(jié)點(diǎn)數(shù)據(jù)的上一個(gè)節(jié)點(diǎn)就應(yīng)該是E1
從上面可知,E1.next == header,為什么要把header.previous = E1呢?
其實(shí)包含著一個(gè)遞歸在里面。
如果再新增一個(gè)數(shù)據(jù) Entry E2 :
從上面的代碼可以看出,E2的實(shí)例化過程是:(其實(shí)linkedlist每次新增一個(gè)數(shù)據(jù),都通過header傳值)
Entry E2 = new Entry(data, header, header.previous);
注意代碼部分的負(fù)值。關(guān)鍵就是這里,實(shí)例化的時(shí)候,E2.previous = header.previous = E1
簡單得完成了負(fù)值過程。
然后 E2.previous.next = E1.next = E2
E2.next.previous = header.previous = E2 .......(接著插入下一條數(shù)據(jù),如此遞歸)
(6)記錄鏈表位數(shù)
涉及到了一個(gè)小小的遞歸算法。
linkedlist記錄一。完畢。。