LinkedList和链表

server/2024/10/21 10:12:03/

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.ppmy.cn/server/7680.html

相关文章

低配置的电脑上刷新WPF DataGrid 很卡,如何优化?

要优化低配置电脑上WPF DataGrid的刷新卡顿问题&#xff0c;可以尝试以下几种方法&#xff1a; 启用虚拟化技术&#xff1a; VirtualizingStackPanel.IsVirtualizing"True" 。 WPF DataGrid支持行虚拟化&#xff0c;这意味着只有当前可见的行会被加载和渲染&#xf…

OpenHarmony实战开发-Axios获取解析网络数据。

介绍 本示例介绍使用第三方库的Axios获取GBK格式的网络数据时&#xff0c;通过util实现GBK转换UTF-8格式。该场景多用于需要转换编码格式的应用。 效果图预览 使用说明 直接进入页面就可获取GBK格式的用户名信息并进行解码操作。 实现思路 1.使用第三方库Axios获取网络数据…

分类神经网络1:VGGNet模型复现

目录 分类网络的常见形式 VGG网络架构 VGG网络部分实现代码 分类网络的常见形式 常见的分类网络通常由特征提取部分和分类部分组成。 特征提取部分实质就是各种神经网络&#xff0c;如VGG、ResNet、DenseNet、MobileNet等。其负责捕获数据的有用信息&#xff0c;一般是通过…

react脚手架创建项目,配置别名(alias)

React脚手架项目使用 react-scripts 封装了webpack配置&#xff0c;所以我们需要通过 config-overrides 或者 eject 的方式来修改webpack配置 可以的话 &#xff0c;创建项目的时候可以使用vite &#xff0c;我这是老项目屎山 懒得迁移 &#xff0c;但还得改呀 ## 1. 安装依…

AI助力科研创新与效率双提升:ChatGPT深度科研应用、数据分析及机器学习、AI绘图与高效论文撰写

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

for循环的用法

for循环的用法 for 循环是一种在 Python 中用于迭代序列&#xff08;如列表、元组或字符串&#xff09;或其他可迭代对象的循环结构。下面是一些常见的 for 循环用法&#xff1a; 遍历列表&#xff1a;使用 for 循环遍历列表中的元素。 fruits ["apple", "b…

CSS显示模式

目录 CSS显示模式简介 CSS显示模式的分类 块元素 行元素 行内块元素 元素显示模式的转换 使块内文字垂直居中的方法 设计简单小米侧边栏&#xff08;实践&#xff09; CSS显示模式简介 元素显示模式就是元素&#xff08;标签&#xff09;以什么方式进行显示&#xff0…

毕业设计——基于ESP32的智能家居系统(语音识别、APP控制)

ESP32嵌入式单片机实战项目 一、功能演示二、项目介绍1、功能演示2、外设介绍 三、资料获取 一、功能演示 多种控制方式 ① 语音控制 ②APP控制 ③本地按键控制 ESP32嵌入式单片机实战项目演示 二、项目介绍 1、功能演示 这一个基于esp32c3的智能家居控制系统&#xff0c;能实…