自我理解java linkedlist插入数据的算法:
首先看一下,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);//初始化时先实例一个header,链表头
6
7
8 /**
9 * Constructs an empty list.//构造一个空链表
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 {//每个数据存放,所要用到的静态内部类
25 E element;
26 Entry next;//后一个节点
27 Entry previous;//接一个节点
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
以上部分就是算法所在:(一个简单的公式替换过程)
算法步骤(对应上面的编号):
(1)实例化一个header (Entry)
header.next = header
header.previous = header
当有第一条数据插入链表:
(3)实例化一个 Entry newEntry (以下简称E1)
E1.next = header
E1.previous = header.previous
E1.previous.next = header.previous.next = header.next
(4)由上面可得:
newEntry.previous.next = newEntry;
作用:
相当于 E1.previous.next = header.next = E1
其实就是,让上一个节的next指向下一个节点数据
所以header.next 的下一个节点就是E1
(5)E1.next.previous = header.previous = E1(这里用得巧妙)
其实这个用法单从E1.next.previous= E1单这么看,很直观因为E1的下一个节点数据的上一个节点就应该是E1
从上面可知,E1.next == header,为什么要把header.previous = E1呢?
其实包含着一个递归在里面。
如果再新增一个数据 Entry E2 :
从上面的代码可以看出,E2的实例化过程是:(其实linkedlist每次新增一个数据,都通过header传值)
Entry E2 = new Entry(data, header, header.previous);
注意代码部分的负值。关键就是这里,实例化的时候,E2.previous = header.previous = E1
简单得完成了负值过程。
然后 E2.previous.next = E1.next = E2
E2.next.previous = header.previous = E2 .......(接着插入下一条数据,如此递归)
(6)记录链表位数
涉及到了一个小小的递归算法。
linkedlist记录一。完毕。。