java linkedlist 方法_Java LinkedList.add() 增加方法以及原理

首页 > 基础教程 > 集合框架 > LinkedList类

Java LinkedList.add() 增加方法以及原理

LinkedList add(E e)将指定元素添加到此列表的结尾。

源码分析

// 将元素(E)添加到LinkedList中

public boolean add(E e) {

// 将节点(节点数据是e)添加到表头(header)之前。

// 即,将节点添加到双向链表的末端。

addBefore(e, header);

return true;

}

public void add(int index, E element) {

addBefore(element, (index == size ? header: entry(index)));

}

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;

}

public void addFirst(E e) {

addBefore(e, header.next);

}

public void addLast(E e) {

addBefore(e, header);

}

private Entry addBefore(E e, Entry entry) {

//利用Entry构造函数构建一个新节点 newEntry,

Entry newEntry = new Entry(e, entry, entry.previous);

//修改newEntry的前后节点的引用,确保其链表的引用关系是正确的

newEntry.previous.next = newEntry;

newEntry.next.previous = newEntry;

//容量+1

size++;

//修改次数+1

modCount++;

return newEntry;

}

addBefore(E e,Entry entry)方法是个私有方法,所以无法在外部程序中调用(当然,这是一般情况,你可以通过反射上面的还是能调用到的)。

addBefore(E e,Entry entry)先通过Entry的构造方法创建e的节点newEntry(包含了将其下一个节点设置为entry,上一个节点设置为entry.previous的操作,相当于修改newEntry的“指针”),之后修改插入位置后newEntry的前一节点的next引用和后一节点的previous引用,使链表节点间的引用关系保持正确。之后修改和size大小和记录modCount,然后返回新插入的节点。

添加原理

下面分解“添加第一个数据”的步骤:

第一步:初始化后LinkedList实例的情况:

efaa174c36e681b573f59802bcea3ad7.png

第二步:初始化一个预添加的Entry实例(newEntry)。

Entry newEntry = newEntry(e, entry, entry.previous);

2c0acac4ffcc1fca730fce9581c53606.png

第三步:调整新加入节点和头结点(header)的前后指针。

newEntry.previous.next = newEntry;

newEntry.previous即header,newEntry.previous.next即header的next指向newEntry实例。在上图中应该是“4号线”指向newEntry。

newEntry.next.previous = newEntry;

newEntry.next即header,newEntry.next.previous即header的previous指向newEntry实例。在上图中应该是“3号线”指向newEntry。

调整后如下图所示:

图——加入第一个节点后LinkedList示意图

52afdaeea36c39286a4ed6ffcbe772ff.png

下面分解“添加第二个数据”的步骤:

第一步:新建节点。

图——添加第二个节点

7bd8a5c90efdde8e7ee9456b2efcf56e.png

第二步:调整新节点和头结点的前后指针信息。

图——调整前后指针信息

d957549ec63825362db33e9d2e9ac767.png

添加后续数据情况和上述一致,LinkedList实例是没有容量限制的。

总结,addBefore(E e,Entry entry)实现在entry之前插入由e构造的新节点。而add(E e)实现在header节点之前插入由e构造的新节点。为了便于理解,下面给出插入节点的示意图。

5576a5c7c7bfddd6a0e8ac309b777889.png

看上面的示意图,结合addBefore(E e,Entry entry)方法,很容易理解addFrist(E e)只需实现在header元素的下一个元素之前插入,即示意图中的一号之前。addLast(E e)只需在实现在header节点前(因为是循环链表,所以header的前一个节点就是链表的最后一个节点)插入节点(插入后在2号节点之后)。

版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值