首页 > 编程语言 > 详细

java集合 LinkedList 添加元素 add() 的底层

时间:2021-06-09 18:25:53      阅读:24      评论:0      收藏:0      [点我收藏+]

双向链表支撑的数据结构,

对于链表,每一个链子的节称为节点,节点包括3个元素,数据(数据域),头部指针,指向下一个元素,尾部指针(引用域)指向上一个元素;

开头的元素和结尾的元素?

如果不能指向另一个元素则指针指空;*

第一次添加元素:size=0,所添加的元素的顺序是自然合法的;

public LinkedList() { } 创建一个空的linklist{}

执行linkedlast: public boolean add(E e) { linkLast(e);

void linkLast(E e) {
final Node l = last; 当前节点的最后一个节点
final Node newNode = new Node<>(l, e, null); 定义新节点
last = newNode;
if (l == null) 如果当前节点的最后一个节点的元素是空的*
first = newNode; 将新节点添加为第一个节点
else
l.next = newNode; 将新节点添加为最后一个节点的下一个节点
size++; 容量++
modCount++;
}

transient 瞬态的 暂时的

判断为空,index>size:size =n,所添加元素顺序是n+1,判断合法*

遍历到目标下标的一个元素(尚未添加),此间的链表视为当前链表,

preNode.Next = newNode;//当前链表的后指针指向新的节点
       newNode.SetNode(preNode, _linkHead);  //新节点( 前指针指向前节点,后指针当前链表)
       _linkHead.Prev = newNode; //当前列表的前指针指向新节点

添加到指定下标:

public void add(int index, E element) {
checkPositionIndex(index);

if (index == size)
   linkLast(element);
else
   linkBefore(element, node(index));      //node方法找出该下标传入执行before
}

先检查下标是否合法;再执行linklast/linkbefore;

void linkBefore(E e, Node succ) {
// assert succ != null;

在非空节点succ前加入e元素(目标元素)

//指定前驱节点

? final Node pred = succ.prev;

//新的节点,前驱为succ的前驱,其后继是succ
*final Node newNode = new Node<>(pred, e, succ); *

//构建双向链表,succ的前驱是新节点

? succ.prev = newNode;


这三行:pred在succ前,newnode在succ前,succ前指new使插入到中间,前中后;

? if (pred == null) 如果新节点的前一个节点是空
? first = newNode; 新节点作为第一个节点;
? else
? pred.next = newNode; // 前节点的后指针指向新节点
? size++; // 容量自增
? modCount++; //修改次数自增;
}

java集合 LinkedList 添加元素 add() 的底层

原文:https://www.cnblogs.com/msslearning/p/14866455.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!