LinkList 部分源码导读

本文深入讲解了链表这一数据结构的实现原理,通过具体代码示例介绍了如何创建链表节点,以及如何通过头节点进行元素的添加操作。
[align=center][img]http://dl.iteye.com/upload/attachment/0078/0263/d896ca36-894d-3965-adfa-0c7ef047418e.bmp[/img][/align]

[b][size=large]背景:[/size]
[/b]
[size=medium]为了更加好了解LinkList的工作原理,上面是链表的示意图[/size]

  private transient Entry<E> header = new Entry<E>(null, null, null);
private transient int size = 0;

/**
* Constructs an empty list.
*/
public LinkedList() {
header.next = header.previous = header;
}


[size=medium]定义了一个内部类[b]header[/b]变量,其实起到了首节点的标志作用,不存放任何元素(上图的一个节点)
[/size]
private transient Entry<E> header = new Entry<E>(null, null, null);

  private static class Entry<E> {
E element;
Entry<E> next;
Entry<E> previous;

Entry(E element, Entry<E> next, Entry<E> previous) {
this.element = element;
this.next = next;
this.previous = previous;
}
}

[list]
[*]下面创建一个节点
[/list]
 public boolean add(E e) {
addBefore(e, header);
return true;
}


private Entry<E> addBefore(E e, Entry<E> entry) {
Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
newEntry.previous.next = newEntry;
newEntry.next.previous = newEntry;
size++;
modCount++;
return newEntry;
}

上面可以转换成下面的方式
Entry<E> newEntry = new Entry<E>(e, header, header.previous);


[size=medium]当插入第一个节点是,传入了e,header两个元素,header是刚开始创建的头指针,newEntry1的previous对象为header,节点的size增加1[/size]
[list]
[*]因此newEntry1.previous.next= header.next=newEntry1
[*]因此newEntry1.next.previous= header.previous=newEntry1
[/list]

[size=medium]当插入第二个节点是,传入了e,header两个元素,header是刚开始创建的头指针,newEntry2的previous对象为header,节点的size增加1[/size]
[list]
[*]因此newEntry2.previous.next= newEntry1.next=newEntry2
[*]因此newEntry2.next.previous= header.previous=newEntry2
[/list]
..... 依次类推
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值