【数据结构】LinkedList与链表
目录
链表
1、链表的概念及结构
2、LinkedList的使用
2、1什么是LinkedList
2、2LinkedList的使用
3、LinkedList的遍历
4、LinkedList的模拟实现
5、ArrayList和LinkedList的区别
上篇已经熟悉了ArrayList的使用,ArrayList底层使用数组来存储元素。由于其底层是一段连续空间,当在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为O(n),效率比较低,因此ArrayList不适合做任意位置插入和删除比较多的场景。
因此,java集合中又引入了LinkedList,即链表结构。
链表
1、链表的概念及结构
链表大分类
- 单向或者双向
- 带头或者不带头
- 循环或者非循环
2、LinkedList的使用
2、1 什么是LinkedList
LinkedList官方文档
在集合框架中,LinkedList也实现了List接口,具体如下:

- LinkedList实现了List接口
- LinkedList的底层使用了双向链表
- LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问
- LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1)
- LinkedList比较适合任意位置插入的场景
2、2 LinkedList的使用
LinkedList 的构造
| 方法 | 解释 |
| LinkedList ( ) | 无参构造 |
| Public LinkedList ( Collection<? extends E> c ) | 使用其他集合容器中元素构造List |
public static void main ( String [] args ) {// 构造一个空的 LinkedListList < Integer > list1 = new LinkedList <> ();List < String > list2 = new java . util . ArrayList <> ();list2 . add ( "JavaSE" );list2 . add ( "JavaWeb" );list2 . add ( "JavaEE" );// 使用 ArrayList 构造 LinkedListList < String > list3 = new LinkedList <> ( list2 );}
LinkedList常用方法
| 方法 | 解释 |
| boolean add (E e) | 尾插 e |
| void add(int index, E element) | 将 e 插入到 index 位置 |
| boolean addAll(Collection<? extends E> c) | 尾插 c 中的元素 |
| E remove (int index) | 删除 index 位置元素 |
| boolean remove(Object o) | 删除遇到的第一个 o |
| E get(int index) | 获取下标 index 位置元素 |
| E set(int index, E element) | 将下标 index 位置元素设置为element |
| void clear() | 清空 |
| boolean contains(Object o) | 判断 o 是否在线性表中 |
| int indexOf(Object o) | 返回第一个 o 所在下标 |
| int lastIndexOf(Obeject o) | 返回最后一个o 所在下标 |
| List<E> subList(int fromIndex, int toIndex) | 截取部分 list |
以上就是 LinkedList常用方法 ,需要多练熟悉用法
3、LinkedList的遍历
LinkedList<Integer> list1=new LinkedList<>();list1.add(1);list1.add(2);list1.add(3);list1.add(4);
1、for循环遍历
for (int i = 0; i <list1.size() ; i++) {System.out.print(list1.get(i)+" ");}System.out.println(" ");
2、foreach遍历
for (Integer i:list1){System.out.print(i+" ");}System.out.println(" ");
3、使用迭代器遍历---正向遍历
ListIterator<Integer> it= list1.listIterator();while(it.hasNext())System.out.print(it.next()+" ");System.out.println(" "); 4、使用反向迭代器---反向遍历
ListIterator<Integer> rit= list1.listIterator(4);while(rit.hasPrevious())System.out.print(rit.previous()+" ");System.out.println(" ");}
4、LinkedList的模拟实现
模拟实现 LinkedList链表。
public class MyLinkedList {static class ListNode{public int val;public ListNode next;public ListNode prev;public ListNode(int val) {this.val = val;}}public ListNode head;public ListNode last;//头插法public void addFirst(int data){ListNode node=new ListNode(data);if(head==null) {head = last = node;return;}node.next=head;head.prev=node;head=node;}//尾插法public void addLast(int data){ListNode node=new ListNode(data);if(head==null) {head = last = node;return;}last=head;while(last.next!=null){last=last.next;}last.next=node;node.prev=last;last=last.next;}//任意位置插入,第一个数据节点为0号下标public boolean addIndex(int index,int data){int len=size();if(index<0||index>len) {System.out.println("index位置不合法");return false;}if(index==0) {addFirst(data);return true;}if(index==len) {addLast(data);return true;}ListNode cur=findnode(index);ListNode node=new ListNode(data);node.next=cur;cur.prev.next=node;node.prev=cur.prev;cur.prev=node;return true;}private ListNode findnode(int index){ListNode cur=head;while(index!=0){index--;cur=cur.next;}return cur;}//查找是否包含关键字key是否在单链表当中public boolean contains(int key){ListNode cur=head;while(cur!=null){if(cur.val==key)return true;cur=cur.next;}return false;}//删除第一次出现关键字为key的节点public void remove(int key){ListNode cur=head;while(cur!=null){if(cur.val==key){if(cur==head){head=head.next;if(head==null)return;}else {cur.prev.next=cur.next;if(cur.next==null){last=last.prev;}else{cur.next.prev=cur.prev;}}return;}cur=cur.next;}}//删除所有值为key的节点public void removeAllKey(int key){ListNode cur=head;while(cur!=null){if(cur.val==key){if(cur==head){head=head.next;if(head!=null)head.prev=null;}else{cur.prev.next=cur.next;if(cur.next==null){last=last.prev;}else{cur.next.prev=cur.prev;}}}cur=cur.next;}}//得到单链表的长度public int size(){int count=0;ListNode cur=head;if(head==null)return 0;while(cur!=null){count++;cur=cur.next;}return count;}public void display(){ListNode cur=head;if(head==null)return;while(cur!=null){System.out.print(cur.val+" ");cur=cur.next;}System.out.println(" ");}public void clear(){ListNode cur=head,curN=head;while(cur!=null){curN=cur.next;cur.next=null;cur.prev=null;cur=curN;}head=last=null;}}
5、ArrayList和LinkedList的区别
| 不同点 | ArrayList | LinkedList |
| 存储空间上 | 物理上一定连续 | 逻辑上连续,物理上不一定连续 |
| 随机访问 | 支持O(1) | 不支持 O ( n ) |
| 头插 | 需要搬移元素,效率低 O( n ) | 只需修改元素指向,时间复杂度 O(1) |
| 插入 | 空间不够可以扩容 | 没有容量概念 |
| 应用场景 | 元素高效存储+频繁访问 | 任意位置插入和频繁删除 |
【数据结构】LinkedList与链表学习到这里
相关文章:
【数据结构】LinkedList与链表
目录 链表 1、链表的概念及结构 2、LinkedList的使用 2、1什么是LinkedList 2、2LinkedList的使用 3、LinkedList的遍历 4、LinkedList的模拟实现 5、ArrayList和LinkedList的区别 上篇已经熟悉了ArrayList的使用,ArrayList底层使用数组来存储元素。由于其底层…...
《LeetCode热题100》---<5.①普通数组篇五道>
本篇博客讲解LeetCode热题100道普通数组篇中的五道题 第一道:最大子数组和(中等) 第二道:合并区间(中等) 第一道:最大子数组和(中等) 法一:贪心算法 class So…...
根据id查找树形结构中匹配数据与上级所有数据
背后 在用户管理业务开发过程中,通常需要查询出用户管理的菜单数据和当前菜单的所有上级数据。为了方便后续的cv工作,我打算把这种方法记录下来,以备不时之需. 代码实现细节 Data public class MenuDTO {Schema(description "菜单id&qu…...
探索亚马逊Amazon S3:无缝存储管理与极速数据传输的奥秘
亚马逊云科技中Amazon S3,因其设计简单与高度可靠,允许用户通过互联网存储和检索任意数量的数据,并能够自动扩展以满足各种规模的需求,使得Amazon S3成为了许多云计算应用和网站的核心存储基础设施之一,Amazon S3提供的…...
Linux_监测CPU和内存
通过TOP持续获取进程的CPU和内存消耗,并写入到表格 # 配置进程名 processvm-agent # 配置次数 number100 # 配置间隔时间 time5 # csv结果文件 filecm_$(date %s).csv echo "%CPU,%MEM">${file} pid$(ps -aux | grep ${process} | awk -F {OFS"…...
OpenCV经典案例:01 答题卡识别
目录 透视变换矫正 选项识别匹配 QT 界面设计 引言:随着信息化的发展,计算机阅卷已经成为一种常规操作。在大型考试中,客观题基本不再 需要人工阅卷。本项目旨在开发一个基于OpenCV的高效答题卡识别系统,通过先进的图像处理和模…...
进程的管理与控制详解:创建、终止、阻塞等待与非阻塞等待
目录 一、进程创建 1、实例 2、fork函数详解 (1)fork函数模板 (2). fork() 函数的工作原理 (3). fork() 返回值和错误处理 3、如何理解进程创建过程 二、进程终止 1、终止是在做什么? 2、进程终止,有三种情况 3、进程如何终止? 三…...
【从零开始一步步学习VSOA开发】开发环境搭建
开发环境搭建 开发 VSOA 首先需要搭建开发环境,这里讲解 Windows 下 C/C 开发环境搭建方法。 下载 IDE 并申请授权码 SylixOS 的开发和部署需要 RealEvo-IDE 的支持,因此您需要先获取 RealEvo-IDE 的安装包和注册码。 RealEvo-IDE 分为体验版和商业版…...
一篇文章让你用我的世界中的红石搞懂什么是ALU!
目录 1.一些在开始的约定 2.七大逻辑门电路 1、 与门 2、 或门 3、 非门 5、 或非门 6、 异或门 7、 同或门 3.半加器 4.全加器 5.ALU 1.一些在开始的约定 相同的概念:相同的概念:高电平低电平逻辑真逻辑假 开关的开 开关的关 灯的亮 灯…...
硬盘数据恢复:所需时长、全面指南及注意事项
在数字化时代,硬盘作为我们存储重要数据的核心设备,其重要性不言而喻。然而,由于各种原因,如误删除、格式化、硬盘故障等,我们时常面临数据丢失的困境。数据恢复不仅关乎个人隐私和信息安全,更可能影响到我…...
基于SpringBoot+Vue的科研管理系统(带1w+文档)
基于SpringBootVue的科研管理系统(带1w文档) 基于SpringBootVue的科研管理系统(带1w文档) 科研的管理系统设计过程中采用Java开发语言,B/S结构,采取springboot框架,并以MySql为数据库进行开发。结合以上技术,对本系统的整体、数据库、功能模块…...
计算机组成原理 —— 五段式指令流水线
计算机组成原理 —— 五段式指令流水线 五段式指令流水线运算类指令LOAD指令的执行过程STORE指令的执行过程条件转移指令执行过程无条件转移指令的执行过程 我们今天来看看五段式指令流水线: 五段式指令流水线 五段式指令流水线是一种常见的处理器架构设计中采用的…...
【Bigdata】什么是关系联机分析处理
这是我父亲 日记里的文字 这是他的生命 留下留下来的散文诗 几十年后 我看着泪流不止 可我的父亲已经 老得像一个影子 🎵 许飞《父亲写的散文诗》 关系联机分析处理(Relational Online Analytical Processing,简称 ROLA…...
svd在求解最小二乘中的应用
文章目录 线性最小二乘的直接解法(正规方程解法)什么是伪逆?伪逆矩阵的一般形式伪逆矩阵与SVD的关系 线性最小二乘的直接解法(正规方程解法) 对于 A x b \boldsymbol{A}xb Axb的线性最小二乘问题,有直解析…...
JVM—垃圾收集算法和HotSpot算法实现细节
参考资料:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)周志明 1、分代回收策略 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取…...
nvidia系列教程-AGX-Orin基础环境搭建
目录 前言 一、Agx-Orin(32GB)介绍 1.1 GPU 1.2 CPU 1.3 NVDLA 1.4 内存 1.5 存储 二、安装JetPack SDK 三、基础环境配置 四、jetpack软件版本 总结 前言 NVIDIA Jetson AGX Orin 是一款功能强大的嵌入式AI平台,专为需要高性能和低…...
使用SpringAOP实现公共字段填充
文章目录 概要整体架构流程技术细节小结 概要 在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修改人等字段,在编辑员工或者编辑菜品分类时需要设置修改时间、修改人等字段。这些字段属于公共字段,也就是也就是在我们的系统中很多表…...
c++初阶-----适配器---priority_queue
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...
VSCode上安装C#环境教程
本章教程,教你如何在vscode上,可以快速运行一些基础的c#代码。 1、下载 .NET Code SDK 下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/sdk-for-vs-code?utm_source=vs-code&utm_medium=referral&utm_campaign=sdk-install 根据自己的操作系统,选择…...
VS Code 和 Visual Studio 哪个更好
文章目录 VS Code 和 Visual Studio 哪个更好Visual Studio Code简介Visual Studio简介相同点差异点总结 VS Code 和 Visual Studio 哪个更好 Visual Studio Code简介 Visual Studio Code(简称 VS Code)是一款开源的、免费的、跨平台的、轻量级的代码编…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
