LinkedList add remove get 代码分析
add
void linkLast(E e) { //e 要添加的元素
final Node<E> l = last; // 最后一个元素
final Node<E> newNode = new Node<>(l, e, null); //创建元素新节点
last = newNode;
if (l == null)// 如果最后一个节点null,说明是第一次add 元素
first = newNode; //将新的元素置第一个元素
else
l.next = newNode; // 如果最后一个节点不为null,就把新节点挂载最后一个节点的下面
size++; //集合中真实的元素个数
modCount++;// 操作数++
}
remove
public E remove(int index) {
checkElementIndex(index);
return unlink(node(index));
}
// ===============================获取要删除的节点
Node<E> node(int index) {// index=2
// assert isElementIndex(index);
if (index < (size >> 1)) {
Node<E> x = first;
//遍历index 找到要删除的node
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
// =================================删除元素
E unlink(Node<E> x) {// x 要删除的节点
// assert x != null;
final E element = x.item; // 获取要删除node的item
final Node<E> next = x.next//获取要删除node.next
final Node<E> prev = x.prev;////获取要删除node.prev
// 处理delNode 的prev 节点
if (prev == null) { // 如果没有上一个元素,就说明delNode是头节点,将delNode的next 节点置为first
first = next;
} else {
prev.next = next; // 如果delNode有上一个节点,就将上一个节点的next 置为delNode的next。简单说就是delNode.next 替换 delNode的位置
x.prev = null; // 将delNode 的prev 置为null
}
// 处理delNode 的next节点
if (next == null) {// 说明delNode 是最后一个node
last = prev; // 那么delNode 的prev 就是最后一个node
} else {
next.prev = prev; // 将prev 节点 关联到next.prev节点
x.next = null; // 将delNode 的next置为null
}
x.item = null;// 将delNode 的item置为null
size--; // 数组容量--
modCount++; // 操作数据++
return element; // 返回删除的node
}
LinkedList add remove get 代码分析的更多相关文章
- VSM(Virtual Storage Manager) add new osd 代码分析
vsm add new osd 流程 后台获取可用设备 | 选择可用设备及osd相关信息等 | 点击add按钮,把准备部署的osd信息添加到需要部署的item列表中 | 点击submit按钮,添加it ...
- HashSet——add remove contains方法底层代码分析(hashCode equals 方法的重写)
引言:我们都知道HashSet这个类有add remove contains方法,但是我们要深刻理解到底是怎么判断它是否重复加入了,什么时候才移除,什么时候才算是包括????????? add ...
- LinkedList详解-源码分析
LinkedList详解-源码分析 LinkedList是List接口的第二个具体的实现类,第一个是ArrayList,前面一篇文章已经总结过了,下面我们来结合源码,学习LinkedList. 基于双 ...
- [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(4)
这个系列已经写了6篇,链接地址如下: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Auto ...
- lighttpd与fastcgi+cgilua原理、代码分析与安装
原理 http://www.cnblogs.com/skynet/p/4173450.html 快速通用网关接口(Fast Common Gateway Interface/FastCGI)是通用网关 ...
- LinkedList的实现源码分析
LinkedList 以双向链表实现.链表无容量限制,但双向链表本身使用了更多空间,也需要额外的链表指针操作. 按下标访问元素--get(i)/set(i,e) 要悲剧的遍历链表将指针移动到位(如果i ...
- Java日常总结之LinkedList、ArrayList的效率分析
前言: 在我们平常开发中难免会用到List集合来存储数据,一般都会选择ArrayList和LinkedList,以前只是大致知道ArrayList查询效率高LinkedList插入删除效率高,今天来实 ...
- java基础解析系列(十)---ArrayList和LinkedList源码及使用分析
java基础解析系列(十)---ArrayList和LinkedList源码及使用分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder jav ...
- Hive metastore整体代码分析及详解
从上一篇对Hive metastore表结构的简要分析中,我再根据数据设计的实体对象,再进行整个代码结构的总结.那么我们先打开metadata的目录,其目录结构: 可以看到,整个hivemeta的目录 ...
随机推荐
- (11)oracle触发器
触发器是特殊的存储过程. 每当一个特定的数据操作语句(inster,update,delete)在指定的表上触发时,Oracle自动的地执行触发器中定义的语句序列. create trigger 触发 ...
- codeforces-103B
题目连接:http://codeforces.com/contest/103/problem/B B. Cthulhu time limit per test 2 seconds memory lim ...
- Good Bye 2016 A. New Year and Hurry【贪心/做题目每道题花费时间按步长为5等差增长,求剩余时间够做几道题】
A. New Year and Hurry time limit per test 1 second memory limit per test 256 megabytes input standar ...
- Codeforces Round #445 A. ACM ICPC【暴力】
A. ACM ICPC time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...
- hdu6038
hdu6038 分析 求函数 \(f\) 的构成方案,\(f\) 确定下来后,\(f\) 和 \(b\) 的值也是一一对应的了( \(f(i)=b_{f(a_i)}\) ),观察 \(a\) 数组,代 ...
- NMAP输出结果中CPE的含义
NMAP输出结果中CPE的含义 CPE全称是Common Platform Enumeration,意思是通用平台枚举项.它是NMAP对识别出来的软件.操作系统和硬件的一种命名方式.它的格式如下: ...
- Uva 11077 Find the Permutation
可以发现最优的方案就是一个循环节内互换. 所以一个有n个元素,c个循环节的置换的交换次数(最少)是n-c. 然后就可以递推了,把i插入到前i-1个元素构成的置换中,要么新成立一个循环,要么加入到之前的 ...
- SQL 连表更新
现在数据如下: 需求如下: 要求 更新 Earnings 表中的Earnings字段 当 Table_2 KPI 大于等于1时 Earinings = KPI* 2000,否则等于 KPI* 1500 ...
- NSOperationQueue 和 NSOperation
The NSOperationQueue class regulates the execution of a set of NSOperation objects. After being adde ...
- Docker删除全部镜像和容器
杀死所有正在运行的容器 docker kill $(docker ps -a -q) 删除所有已经停止的容器 docker rm $(docker ps -a -q) 删除所有未打 dangling ...