LinkedList add remove get 代码分析
2024-08-29 16:11:46
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
}
最新文章
- UWP开发随笔——UWP新控件!AutoSuggestBox!
- tomcat错误:@HandlesTypes annotation of one or more ServletContentInitializers
- RIDE常用快捷键
- nginx+keepalived实现nginx双主高可用的负载均衡
- poj 2479 dp求分段最大和
- python学习笔记:python数字
- 【Unity3D】【NGUI】UICamera
- Cms 总结(转)
- J1002.JavaFX简介
- README.md用法
- bzoj 2339: [HNOI2011]卡农
- Java复制、移动和删除文件
- Ping 笔记
- ASP.NET Core如何使用WSFederation身份认证集成ADFS
- tornado的异步效果
- Sql Server数据库之约束
- Python3 WebDriver操作cookie的方法
- ionic日历插件
- iOS 一个开发者账号 多台Mac 共用
- 如何使用沙箱测试单笔转账到支付宝账号(php版) https://openclub.alipay.com/read.php?tid=1770&;fid=28
热门文章
- Wannafly挑战赛10 D 小H的询问(线段树)
- Python的程序结构[1] ->; 方法/Method[2] ->; 魔术方法 __init__ / __del__ / __new__
- 几何【P2313】 [HNOI2005]汤姆的游戏
- SOAP、SOCKET协议
- Guess Number Higher or Lower II -- LeetCode
- 【bzoj1076】【SCOI2008】【奖励关】期望最优值dp
- c#ppt练习
- Windows 8.1中WinRT的变化(一)——新增控件
- 【POI】导出excel文件,不生成中间文件,直接将内存中的数据创建对象下载到浏览器
- 网易云音乐PC客户端加密API逆向解析