java linkedlist 算法笔记一

自我理解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记录一。完毕。。


你可能感兴趣的:(java linkedlist 算法笔记一)