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

摘要:
=null;在非空节点succ前加入e元素//指定前驱节点finalNodepred=succ.prev;//新的节点,前驱为succ的前驱,其后继是succ*finalNodenewNode=newNode;*//构建双向链表,succ的前驱是新节点succ.prev=newNode;这三行:pred在succ前,newnode在succ前,succ前指new使插入到中间,前中后;if如果新节点的前一个节点是空first=newNode;新节点作为第一个节点;elsepred.next=newNode;//前节点的后指针指向新节点size++;//容量自增modCount++;//修改次数自增;}

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

对于链表,每一个链子的节称为节点,节点包括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 瞬态的 暂时的,被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() 的底层》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Learning Scrapy笔记(六)- Scrapy处理JSON API和AJAX页面linux内核内存管理(zone_dma zone_normal zone_highmem)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

c++ 动态判断基类指针指向的子类类型(typeid)

我们在程序中定义了一个基类,该基类有n个子类,为了方便,我们经常定义一个基类的指针数组,数组中的每一项指向都指向一个子类,那么在程序中我们如何判断这些基类指针是指向哪个子类呢? 本文提供了两种方法 (1) 自定义类id, (2)typeid 一、自定义id 如下所示基类father有两个子类son1 和 son2,我们在基类中定义类虚函数id,子类中分别重...

Redis实现之压缩列表

压缩列表 压缩列表(ziplist)是列表键和哈希键的底层实现之一,当一个列表键只包含少量列表项,并且每个列表项要嘛是整数值,要嘛是比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现。例如,执行以下命令将创建一个压缩列表键的底层实现 127.0.0.1:6379> RPUSH lst 1 3 5 10086 "hello" "worl...

C99标准

1. 增加restrict指针    C99中增加了公适用于指针的restrict类型修饰符,它是初始访问指针所指对象的惟一途径,因此只有借助restrict指针表达式才能访问对象。restrict指针指针主要用做函数变元,或者指向由malloc()函数所分配的内存变量。restrict数据类型不改变程序的语义。    如果某个函数定义了两个restric...

0x01 译文:Windows桌面应用Win32开发简介

本节课将简单介绍下使用C++开发Windows桌面应用的一些基础知识  目录: 准备你的开发环境 Windows 代码规范 操作字符串 什么是一个Window? WinMain:程序的入口点 1. 准备你的开发环境 安装 Windows SDK        要用C或者C++开发Windows 程序,你必须安装 Microsoft Windows So...

C/C++指针内存分配小细节

char *pc = NULL; pc = new char[0]; pc[0] = '1'; 相信初学者看见上面这段代码,都会觉得奇怪,new char[n]中的n指定给指针变量分配多少内存空间,而n=0时代表什么呢? 其实上面的程序编译、运行都是正确的。因为编译器识别到指定大小为0时,会自动为其分配1BYTE的内存空间。 尝试过的小伙伴会发现,给p[1...

TLV(类型—长度—值)格式及编码

转自:http://www.cnblogs.com/tml839720759/archive/2014/07/13/3841820.html 引子:   前段时间在项目中第一次接触TLV,项目中用这种格式来传输图片,语音等。 关于TLV   TLV是一种可变的格式,意为:Type类型, Lenght长度,Value值。Type:该字段是关于标签和编码格式的...