LinkedList接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null )。除了实现 List 接口外, LinkedList 类还为在列表的开头及结尾 get 、 remove 和 insert 元素提供了统一 的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。
LinkedList的特点
LnkedList是一个双向的链表结构,双向链表,结构如下
Linkedlist是链表源码如下:
public class LinkedList<E>{
transient int size = 0;
//双向链表的头结点
transient Node<E> first;
//双向链表的最后一个节点
transient Node<E> last;
//节点类【内部类】
private static class Node<E> {
//数据元素
E item;
//节点的下一个节点
Node<E> next;
//节点的上一个节点
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
LinkedList是双向链表,在代码中是一个Node类。内部并没有数组的结构。双向链表肯定存在一个头节点和一个尾部节点。node节点类,是以内部类的形式存在于LinkedList中的。Node类都有两个成员变 量:
链表数据结构的特点 : 查询慢,增删快!
LinkedList的数据结构的特点查询慢、增删快。
删除的话和插入类似 例如删除B,先查到B节点的上一个节点A和下一个节点C,然后把A节点的下一个节点指向C,把B的上一个节点置空 把C节点的上一个节点指向A,B的下一个节点置空,最后把B节点中的数据置为空 查询的慢则是需要一个节点一个节点的往后查知道查到自己想要的节点,数据量越大效率越低,下面咱们从源码层面进行分析
public boolean add(E e) {
//连接到链表的末尾
linkLast(e);
return true;
}
//连接到最后一个节点
void linkLast(E e) {
//将末尾节点赋值给l
final Node<E> l = last;
//创建一个新节点,新节点的上一个节点为l,数据为e,下一个节点为null(因为是最后一个节点所以下一个节点为null)
final Node<E> newNode = new Node<>(l, e, null);
//将当前节点作为末尾节点
last = newNode;
//判断l节点是否为null
if (l == null)
//即是尾结点也是头节点
first = newNode;
else
//之前的末尾节点的下一个节点设置为新增加的节点
l.next = newNode;
//当前集合的元素数量+1
size++;
//操作集合数+1。modCount属性是修改计数器
modCount++;
}
public void add(int index, E element) {
//检查索引位是否符合要求
checkPositionIndex(index);
//判断index是否等于元素的个数,如果等于则为最后一个元素
if (index == size)
linkLast(element);
else
//连接到指定节点的后面
linkBefore(element, node(index));
}
////根据索引查询链表中节点!
Node<E> node(int index) {
//判断索引是否小于已经存储元素个数的1/2
if (index < (size >> 1)) {
Node<E> x = first;
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;
}
}
//将当前元素添加到指定节点之前
void linkBefore(E e, Node<E> succ) {
// 取出succ节点的前一个节点
final Node<E> pred = succ.prev;
//创建元素的节点 : 上一个节点,当前元素,下一个节点
//则元素的上一个节点为 pred,下一个节点为succ
final Node<E> newNode = new Node<>(pred, e, succ);
//给succ的前一个节点重新赋值为新节点
succ.prev = newNode;
//判断succ的上一个节点是否为null,如果为null 则表示succ为头部节点
if (pred == null)
//当新创建的节点作为头部节点
first = newNode;
else
//给succ的前一个节点的下一个节点重新赋值为新创建的节点
pred.next = newNode;
size++;
modCount++;
}
public E remove(int index) {
checkElementIndex(index);
//删除元素节点,
//node(index) 根据索引查到要删除的节点
//unlink()删除节点
return unlink(node(index));
}
//删除一个指定节点
E unlink(Node<E> x) {
//获取要删除节点中的元素
final E element = x.item;
//获取要删除节点的下一个节点
final Node<E> next = x.next;
//获取要删除节点的下一个节点
final Node<E> prev = x.prev;
if (prev == null) {
//如果为null,说明要删除节点为头部节点
first = next;
} else {
//上一个节点的下一个节点改为要删除节点的下一个节点
prev.next = next;
//将要删除节点的上一个节点置空
x.prev = null;
}
if (next == null) {
//如果为null,说明要删除节点为尾部节点
last = prev;
} else {
//要删除节点的下一个节点的上节点改为要删除节点的上一个节点
next.prev = prev;
//要删除节点的上一个节点置空
x.next = null;
}
//删除要删除节点内的元素
x.item = null;
size--;
modCount++;
return element;
}
public E get(int index) {
//验证节点是否存在
checkElementIndex(index);
//node(index) 获取节点
return node(index).item;
}
node(index) 放在已经在上面进行分析了,需要对节点遍历(不是遍历所有的节点,而是和所有节点的1/2节点进行比较,类似二分查找 )
原网址: 访问
创建于: 2023-01-05 10:31:07
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论