LinkedList和链表

1.ArrayList的缺陷

ArraryList由于底层是一段连续的空间,所以在ArrayList任意位置插入或者删除元素时,就 需要将后续元素往前或者往后搬移,时间复杂度为O(n),效率比较低,因此ArrayList不适合做任意位置插入和删除比较多的场景。因此,Java集合中还引入了LinkedList,即链表结构。

2.链表的概念和结构

链表是一种物理结构上非连续的存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现 的。我们先来看张图:

注意:

  1. 从上图可以看出,链式结构在逻辑上是连续的,但是物理上不一定连续
  2. 现实中的结点一般都是从堆上申请出来的
  3. 从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续

在实际情况中,链表的结构非常多样,以下情况组合起来就有八种链表结构:

    1.单向或者双向

2.带头或者不带头

3.循环或者非循环

尽管链表的结构有这么多,但重要的有两种:

  1. 无头单向非循环结构简单一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶,图的邻接表等等。
  2. 无头双向链表:在Java的集合框架库中LinkedList底层实现就是无头双向循环链表

3.LinkedList

LinkedList 是一种常见的数据结构,它表示一个节点的集合,这些节点不仅保存了数据,还保存了指向下一个节点的引用。这种结构允许我们从头尾两个方向遍历数据,同时也可以在任意位置插入或删除节点。

LinkedList 的主要特点包括:

  1. 动态大小LinkedList 的大小可以在运行时动态改变,可以方便地添加或删除元素。
  2. 有序性:元素在 LinkedList 中是按照它们被插入的顺序排列的。
  3. 插入和删除的高效性:在 LinkedList 的任何位置插入或删除元素的时间复杂度都是 O(1),因为只需要修改相邻节点的引用即可。但是,请注意,找到要插入或删除的位置的时间复杂度可能依赖于具体的实现和搜索策略。
  4. 空间开销:由于每个节点除了保存数据外,还需要保存指向下一个节点的引用,因此 LinkedList 通常比数组或固定大小的列表占用更多的空间。
  5. 不支持随机访问:与数组不同,链表不支持快速随机访问元素,因为需要从头节点或尾节点开始逐个遍历才能找到目标元素。

LinkedList 的实现可以有多种形式,但最常见的两种是单向链表(每个节点只有一个指向下一个节点的引用)和双向链表(每个节点都有一个指向前一个节点和一个指向下一个节点的引用)。双向链表提供了更强大的功能,比如可以从尾部开始遍历,或者在任意位置向前或向后移动。

在集合框架中,LinkedList也实现了List接口,具体如下:

同样地我们能从上图得出一些结论:

  1. LinkedList实现了List接口
  2. LinkedList底层使用了双向链表
  3. LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问
  4. LinkedList的任意位置插入删除元素时效率比较高,时间复杂度为O(1)
  5. LinkedList比较适合任意位置插入的场景

4.关于使用

4.1LinkedList的构造

方法解释
LinkedList()无参构造
public LinkedList(Collection<? extends E> c)使用其他集合容器中元素构造List

示例

public static void main(String[] args) {//构造一个空的LinkedListList<Integer> list1=new LinkedList<>();List<String> List2=new ArrayList<>();list2.add("唱");list2.add("跳");list2.add("rap");list2.add("篮球");//使用ArrayList构造LinkeListList<String> list3 =new LinkeList<>(list2);
}

4.2LinkedList的一些常用的方法介绍

方法解释
boolean add(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(Object o)返回最后一个o的下标
List<E> sublist(int fromIndex,int toIndex)截取部分list

4.3LinkedList的遍历

public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();list.add(1); // add(elem): 表示尾插list.add(2);list.add(3);list.add(4);list.add(5);list.add(6);list.add(7);System.out.println(list.size());// foreach遍历for (int e:list) {System.out.print(e + " ");}System.out.println();// 使用迭代器遍历---正向遍历ListIterator<Integer> it = list.listIterator();while(it.hasNext()){System.out.print(it.next()+ " ");}System.out.println();// 使用反向迭代器---反向遍历ListIterator<Integer> rit = list.listIterator(list.size());while (rit.hasPrevious()){System.out.print(rit.previous() +" ");}System.out.println();
}

5.ArrayList和LinkedList

不同点ArrayListLinkedList
存储空间上物理上一定连续逻辑上连续,但物理上不一定连续
随机访问支持O(1)不支持O(N)
头插需要搬移元素,效率低O(N)只需要修改引用的指向,时间复杂度为O(1)
插入空间不够时需要扩容没有容量的概念
应用场景元素高效存储+频繁访问任意位置插入和删除频繁

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

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

相关文章

rmallox勒索病毒威胁网络安全:如何避免数据被锁定

尊敬的读者&#xff1a; 随着信息技术的飞速发展&#xff0c;网络空间的安全问题日益凸显。近年来&#xff0c;一种名为.rmallox的勒索病毒频繁出没&#xff0c;给广大计算机用户带来了严重的困扰。本文将对该病毒进行深入剖析&#xff0c;并探讨相应的应对策略。在面对被勒索…

十大排序算法详解-上篇:比较排序算法【python 动态图解】

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

11.接口自动化学习-Yaml学习

1.配置文件作用 配置文件项目角度&#xff1a; &#xff08;1&#xff09;现成的应用–第三方组件 mysql–数据库–my.conf tomcat–web服务器–server.xml 修改&#xff1a;连接数/端口 redis–缓存服务器–redis.conf 修改配置 jemeter–压测工具–jemeter.properties–修改…

【探讨】RocketMQ消息灰度方案-消息逻辑隔离

vivo 鲁班平台 RocketMQ 消息灰度方案 - 稀土掘金分布式- vivo鲁班RocketMQ平台的消息灰度方案MQ消息在生产环境和灰度环境隔离一般怎么实现?消息隔离的原则 中心正常消费者,可以同时消费正常的消息和特定标签的消息(自动识别);特定标签的消费者,只能消费特定标签的消息。灰…

【Linux 进程间通信】管道(三)

文章目录 1.管道的五种特征2.管道的四种情况 1.管道的五种特征 ①&#x1f34e;匿名管道只能用于有血缘关系的进程之间进行通信&#xff08;爷孙进程之间可以进行通信&#xff09;&#xff0c;常用于父子之间进行通信&#xff1b; ②&#x1f34e;管道内部&#xff0c;自带进…

【独家】万字长文带你梳理Llama开源家族:从Llama-1到Llama-3

Datawhale干货 作者&#xff1a;张帆&#xff0c;陈安东&#xff0c;Datawhale成员 引言 在AI领域&#xff0c;大模型的发展正以前所未有的速度推进技术的边界。 北京时间4月19日凌晨&#xff0c;Meta在官网上官宣了Llama-3&#xff0c;作为继Llama-1、Llama-2和Code-Llama之后…

ExpertPrompting:指导大语言模型成为杰出专家

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 论文标题&#xff1a;ExpertPrompting: Instructing Large Language Models to be Distinguished Experts 论文地址&#xff1a;https://arxiv.org/abs/2305.14688 作者 & 机构&#xff1a;Benfen…

MySQL基础篇总结

参考&#xff1a;黑马程序员MySQL基础视频链接 数据库基本操作 启动与停止 1.第一种方式&#xff1a; 1>以管理员身份运行cmd 2>在命令行窗口中输入: 启动:net start mysql80停止:net stop mysql80 2.第二种方式: 1>WinR快捷方式打开如下&#xff1a; 输入&#…

玩转Virtual Box虚拟机

玩转Virtual Box虚拟机 虚拟化技术和虚拟机简介 什么是虚拟化技术&#xff1f; 虚拟化技术是将计算机的各种硬件资源予以抽象、转换、分割、组合的一种计算机技术。虚拟化技术打破了实体结构间不可切割的障碍&#xff0c;从而使用户可以按照需求重新组合硬件资源&#xff0c…

Linux-缓冲区(简单理解)

1. 缓冲区是什么 缓冲区就是一段内存空间。 2. 为什么要有缓冲区 IO写入有两种&#xff1a; 写透模式&#xff08;WT&#xff09; 成本高&#xff0c;效率低写回模式&#xff08;WB&#xff09; 成本低&#xff0c;效率高 写透模式&#xff1a;每次的文件写入都要立即刷新…

【树莓派Linux内核开发】入门实操篇(虚拟机Ubuntu环境搭建+内核源码获取与配置+内核交叉编译+内核镜像挂载)

【树莓派Linux内核开发】入门实操篇&#xff08;虚拟机Ubuntu环境搭建内核源码获取与配置内核交叉编译内核镜像挂载&#xff09; 文章目录 【树莓派Linux内核开发】入门实操篇&#xff08;虚拟机Ubuntu环境搭建内核源码获取与配置内核交叉编译内核镜像挂载&#xff09;一、搭建…

JAVA日志学习(上)

JUL JUL全称Java util Logging是java原生的日志框架 基础概念 Loggers&#xff1a;被称为记录器&#xff0c;应用程序通过获取Logger对象&#xff0c;调用其API来来发布日志信息。Logger通常是应用程序访问日志系统的入口程序。Appenders&#xff1a;也被称为Handlers&#xf…