posts - 12, comments - 3, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

java linkedlist 算法笔记一

Posted on 2010-01-04 19:23 创意恒动力 阅读(2518) 评论(0)  编辑  收藏

自我理解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(nullnullnull);//初始化时先实例一个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记录一。完毕。。



只有注册用户登录后才能发表评论。


网站导航: