LinkedList数据结构链表

LinkedList在Java中是一个实现了ListDeque接口的双向链表。它允许我们在列表的两端添加或删除元素,同时也支持在列表中间插入或移除元素。在分析LinkedList之前,需要理解链表这种数据结构:

  • 链表:链表是一种动态数据结构,由一系列节点组成,每个节点包含数据部分和指向列表中下一个节点的引用。
  • 双向链表:每个节点都有两个链接,一个指向前一个节点,另一个指向后一个节点。

LinkedList 的数据结构

LinkedList中,每个元素都是一个节点,每个节点包含三个部分:存储的数据项、指向前一个节点的引用和指向后一个节点的引用。

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 的核心方法

LinkedList实现了List接口,所以它具有诸如add, remove, get, set等方法,同时也实现了Deque接口,这意味着它也具有offer, poll, push, pop等方法。

源码解析(简化版)

以下是LinkedList中一些关键方法的简化版源码:

public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable {transient int size = 0;transient Node<E> first;transient Node<E> last;public LinkedList() {}public boolean add(E e) {linkLast(e);return true;}void linkLast(E e) {final Node<E> l = last;final Node<E> newNode = new Node<>(l, e, null);last = newNode;if (l == null)first = newNode;elsel.next = newNode;size++;modCount++;}public E remove() {return unlinkFirst(first);}private E unlinkFirst(Node<E> f) {final E element = f.item;final Node<E> next = f.next;f.item = null;f.next = null; first = next;if (next == null)last = null;elsenext.prev = null;size--;modCount++;return element;}public E get(int index) {checkElementIndex(index);return node(index).item;}Node<E> node(int index) {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;}}// 省略其他细节实现
}

代码演示

下面是LinkedList的一个简单使用示例:

import java.util.LinkedList;public class Main {public static void main(String[] args) {LinkedList<String> friends = new LinkedList<>();// 添加元素friends.add("Alice");friends.add("Bob");friends.add("Charlie");// 打印所有元素System.out.println("Initial LinkedList: " + friends);// 删除第一个元素friends.remove();// 打印删除元素后的列表System.out.println("After removal: " + friends);// 获取特定位置的元素String friend = friends.get(1);System.out.println("Second friend: " + friend);}
}

细节分析

使用LinkedList时,有几个细节需要注意:

  • 动态扩展:由于LinkedList是基于节点的,因此它可以动态地添加或删除节点而不需要像数组那样重新分配整个数据结构。
  • 随机访问效率低:获取特定索引的元素时,LinkedList必须从头开始(或从尾开始,取决于哪边更近)遍历节点。因此,随机访问的效率远低于数组。
  • 插入和删除效率高:在任何位置插入或删除元素时,LinkedList只需要改变几个引用,这使得插入和删除操作非常快速。
  • 内存开销:与数组相比,LinkedList的每个元素都需要额外的内存空间来存储前后节点的引用。

通过以上解析,我们可以深入理解LinkedList的工作原理和设计。这有助于开发者在需要适合的数据结构时作出明智的选择。对于需要频繁插入和删除操作的场景,LinkedList可能是一个不错的选择。然而,如果需要快速通过索引访问元素,那么ArrayList可能是更好的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/684340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Recovering a Small String-Codeforces

题目链接&#xff1a;Problem - A - Codeforces 解题思路&#xff1a;分三种情况 第一个字母a,最后一个字母z 前两个字母a 最后两个字母z 其他根据大小算出剩下的字母 下面是c代码&#xff1a; #include<iostream> using namespace std; int main() {int t, n;cin…

算法刷题:四数之和

四数之和 .题目链接题目详情算法原理我的答案 . 题目链接 四数之和 题目详情 算法原理 题目要求的是abctarget 这道题我们可以参考一下三数之和 三数之和中,我们固定的是其中一个数,四数之和中,我们则需要固定两个数 即 abctarget的时候固定d,找到abctarget-d 在求abctarget…

学法减分线上考试答案查找?分享九个搜题直接出答案的软件 #媒体#媒体#笔记

在信息爆炸的时代&#xff0c;选择适合自己的学习辅助工具和资料&#xff0c;能够提供更高效、便捷和多样化的学习方式。 1.试题猪 这是个微信公众号 一款聚合了好多款搜题软件的公众号&#xff0c;对话框可以直接搜题&#xff0c;题库好像挺多的&#xff0c;一次性能出好多…

Linux系统入门

目录 探索命令行 学习使用 man 寻找帮助 控制字符 统计代码行数 统计磁盘使用情况 在Linux下编写 Hello World 程序 使用重定向 使用Makefile管理工程 Unix哲学 探索命令行 Linux命令行中的命令使用格式都是相同的: 命令名称 参数1 参数2 参数3 ... 参数之间用任意…

【无标题】JAVA学习-集合.使用TreeMap

TreeMap 是 Java 中的一种有序映射&#xff08;SortedMap&#xff09;实现&#xff0c;它根据键的自然顺序进行排序&#xff0c;或者根据自定义的 Comparator 进行排序。TreeMap 的底层实现是红黑树&#xff08;Red-Black Tree&#xff09;&#xff0c;这使得它的插入、删除和搜…

HCIA-HarmonyOS设备开发认证V2.0-轻量系统内核内存管理-动态内存

目录 一、动态内存运行机制二、动态内存开发流程三、动态内存使用说明四、动态内存核心算法五、动态内存接口六、代码分析&#xff08;待续...&#xff09;坚持就有收获 一、动态内存运行机制 动态内存管理&#xff0c;即在内存资源充足的情况下&#xff0c;根据用户需求&…

如何在 Angular 中使用 ng2-charts 来使用 Chart.js

介绍 Chart.js 是一个流行的 JavaScript 图表库&#xff0c;ng2-charts 是 Angular 2 的一个包装器&#xff0c;用于在 Angular 中集成 Chart.js。 在本教程中&#xff0c;您将使用 Chart.js 和 ng2-charts 在 Angular 应用程序中创建示例图表。 先决条件 要完成本教程&…

【解决(几乎)任何机器学习问题】:超参数优化篇(超详细)

这篇文章相当长&#xff0c;您可以添加至收藏夹&#xff0c;以便在后续有空时候悠闲地阅读。 有了优秀的模型&#xff0c;就有了优化超参数以获得最佳得分模型的难题。那么&#xff0c;什么是超参数优化呢&#xff1f;假设您的机器学习项⽬有⼀个简单的流程。有⼀个数据集&…

【Rust】使用Rust实现一个简单的shell

一、Rust Rust是一门系统编程语言&#xff0c;由Mozilla开发并开源&#xff0c;专注于安全、速度和并发性。它的主要目标是解决传统系统编程语言&#xff08;如C和C&#xff09;中常见的内存安全和并发问题&#xff0c;同时保持高性能和底层控制能力。 Rust的特点包括&#x…

python数据分析numpy基础之sum用法和示例

1 python数据分析numpy基础之sum用法和示例 python的numpy库的sum()函数&#xff0c;用于对数组指定轴的元素求和。 用法 numpy.sum(a, axisNone, dtypeNone, outNone, keepdims<no value>, initial<no value>, where<no value>)描述 入参a可以为数组或类…

java8-使用流-2

筛选各异的元素 流还支持一个叫作aistinct的方法&#xff0c;它会返回一个元素各异(根据流所生成元素的hashcode和eguals方法实现)的流。例如&#xff0c;以下代码会筛选出列表中所有的偶数&#xff0c;并确保没有重复。图5-2直观地显示了这个过程。 List<Integer>number…

Panalog 日志审计系统 sessiptbl.php 前台RCE漏洞复现

0x01 产品简介 Panalog是一款日志审计系统,方便用户统一集中监控、管理在网的海量设备。 0x02 漏洞概述 Panalog日志审计系统 sessiptbl.php接口处存在远程命令执行漏洞,攻击者可执行任意命令,接管服务器权限。 0x03 影响范围 version <= MARS r10p1Free 0x04 复现…

勒索病毒最新变种.faust勒索病毒来袭,如何恢复受感染的数据?

引言&#xff1a; 随着我们进入数字化时代&#xff0c;数据的重要性变得愈发显著&#xff0c;而网络安全威胁也日益增加。.faust勒索病毒是其中一种备受恶意分子钟爱的危险工具&#xff0c;它通过加密用户文件并勒索高额赎金来对个人和组织发起攻击。本文将深入探讨.faust勒索…

thinkphp+vue企业产品展示网站f7enu

本文首先介绍了企业产品展示网站管理技术的发展背景与发展现状&#xff0c;然后遵循软件常规开发流程&#xff0c;首先针对系统选取适用的语言和开发平台&#xff0c;根据需求分析制定模块并设计数据库结构&#xff0c;再根据系统总体功能模块的设计绘制系统的功能模块图&#…

紫微斗数双星组合:廉贞破军在卯酉

文章目录 前言内容总结 前言 紫微斗数双星组合&#xff1a;廉贞破军在卯酉 内容 紫微斗数双星组合&#xff1a;廉贞破军在卯酉 性格分析 廉贞星、破军星二星同宫&#xff0c;具有冒险开创的精神和领导能力&#xff0c;忍耐力强&#xff0c;工作积极稳重&#xff0c;冲劲大&a…

FreeSWITCH在session上执行定时挂机与取消

一、实验场景环境描述 FreeSWITCH测试机&#xff1a;192.168.137.32 会议室&#xff1a; test1 分机&#xff1a; 1000 模拟的场景&#xff1a; 1&#xff09;会议室test1邀请分机1000加入会议室 在邀请时&#xff0c;添加定时挂机任务。 2&#xff09;分机1000接通后&#x…

【51单片机】利用STC-ISP软件工具【定时器计算器】配置【定时器】教程(详细图示)(AT89C52)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

Shell脚本——提取目录名和文件名

目录 一、${} 1.${var##*/} 2.${var##*.} 3.${var#*.} 4.${var%/*} 5.${var%%.*} 6.总结 二、basename和dirname 1.basename 2.dirname 在许多场景下&#xff0c;我们都需要对文件名称或者文件所在的目录进行操作&#xff0c;已达到我们业务目的。通常的操作是由路径…

Python入门知识点分享——(二十一)多继承和运算符重载

在介绍新的知识之前&#xff0c;我们先对之前的内容做一点补充&#xff0c;在面向对象编程的过程中&#xff0c;一个对象常常被要求具备多方面的功能&#xff0c;从而和多个类产生联系&#xff0c;而这一步的实现就用到了“多继承”。多继承是指一个子类可以继承自多个父类&…

QGIS教程 加载shape数据 矢量数据(批量)

一. 前言 本篇文章主要介绍QGIS的使用&#xff0c;包括如何加载矢量shape数据、查看数据属性、如何加载txt属性数据、怎么用脚本批量加载矢量数据等内容。 如果想了解QGIS&#xff0c;可以参考博文&#xff1a; QGIS基本介绍 如果想了解shape数据格式详情&#xff0c;可以参考…