Java数据结构(六):链表的介绍

🌸雨落在了我的手上:个人主页

🐟个人仓库:Gitee仓库

❄️个人专栏:<<JaveSe>> <<C语言>> <<C语言数据结构>>**

🔥🔥🔥 人生格言:无人扶我青云志,我自踏雪至山巅

🎬 博主简介:


目录

一:ArrayList的缺陷

二:链表

1.链表的概念及结构

2.LinkedList

[1. 什么是LinkedList](#1. 什么是LinkedList)

[2. LinkedList的使用](#2. LinkedList的使用)

[1. LinkedList的其他常⽤⽅法介绍](#1. LinkedList的其他常⽤⽅法介绍)

[2. LinkedList标准库的调用](#2. LinkedList标准库的调用)

3.ArrayList和LinkedList的区别


内容大纲:

本文主要介绍了Java中ArrayList和LinkedList的区别及LinkedList的使用。首先指出ArrayList在频繁插入/删除元素时效率低的缺陷,因其底层为连续数组结构。接着详细讲解了链表的概念,特别是Java集合框架中LinkedList采用的无头双向链表结构,并通过代码示例展示了LinkedList增删改查的常用方法(头插尾插、按索引操作等)。最后对比了两者的核心差异:ArrayList适合随机访问,LinkedList更适合频繁插入删除场景。全文通过理论+代码实践的方式,帮助读者理解这两种重要数据结构的特性和适用场景。


一:ArrayList的缺陷

上节课已经熟悉了ArrayList的使⽤,并且进⾏了简单模拟实现。通过源码知道,ArrayList底层使⽤数 组来存储元素

由于其底层是⼀段连续空间,当在ArrayList任意位置插⼊或者删除元素时,就需要将后序元素整体往 前或者往后搬移,时间复杂度为O(n),效率⽐较低,因此ArrayList不适合做任意位置插⼊和删除⽐较 多的场景。因此:java集合中⼜引⼊了LinkedList,即链表结构。

**二:**链表

1.链表的概念及结构

链表是⼀种物理存储结构上⾮连续存储结构,数据元素的逻辑顺序是通过链表中的引⽤链接次序实现 的。

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

1. 单向或者双向

2. 带头或者不带头

3. 循环或者⾮循环

虽然有这么多的链表的结构,但是我们重点掌握两种:

• ⽆头单向⾮循环链表:结构简单,⼀般不会单独⽤来存数据。实际中更多是作为其他数据结构的⼦ 结构,如哈希桶、图的邻接表等等。另外这种结构在笔试⾯试中出现很多。

• ⽆头双向链表:在Java的集合框架库中LinkedList底层实现就是⽆头双向循环链表。

2.LinkedList

1. 什么是LinkedList

LinkedList的底层是双向链表结构(链表后⾯介绍),由于链表没有将元素存储在连续的空间中,元素存 储在单独的节点中,然后通过引⽤将节点连接起来了,因此在在任意位置插⼊或者删除元素时,不需 要搬移元素,效率⽐较⾼。

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

【说明】

  1. LinkedList实现了List接⼝

  2. LinkedList的底层使⽤了双向链表

  3. LinkedList没有实现RandomAccess接⼝,因此LinkedList不⽀持随机访问

  4. LinkedList的任意位置插⼊和删除元素时效率⽐较⾼,时间复杂度为O(1)

  5. LinkedList⽐较适合任意位置插⼊的场景

2. LinkedList的使用

1. LinkedList的其他常⽤⽅法介绍
2. LinkedList标准库的调用
java 复制代码
import java.util.LinkedList;

public class LinkedListOperations {
    public static void main(String[] args) {
        // 初始化链表
        LinkedList<String> linkedList = new LinkedList<>();
        linkedList.add("A");
        linkedList.add("B");
        linkedList.add("C");
        System.out.println("初始链表: " + linkedList);

        // ================= 增:三种 =================
        // 1. 头插
        linkedList.addFirst("Head");
        System.out.println("1. 头插后: " + linkedList);

        // 2. 尾插
        linkedList.addLast("Tail");
        System.out.println("2. 尾插后: " + linkedList);

        // 3. 中间插 (例如在索引 2 的位置插入)
        linkedList.add(2, "Middle");
        System.out.println("3. 中间插后: " + linkedList);

        // ================= 删:三种 =================
        // 1. 头删
        linkedList.removeFirst();
        System.out.println("1. 头删后: " + linkedList);

        // 2. 尾删
        linkedList.removeLast();
        System.out.println("2. 尾删后: " + linkedList);

        // 3. 中间删 (例如删除索引 2 的元素)
        linkedList.remove(2);
        System.out.println("3. 中间删后: " + linkedList);

        // ================= 改:一种 =================
        // 1. 按照下标进行修改值 (例如将索引 1 的值修改为 "Modified")
        linkedList.set(1, "Modified");
        System.out.println("1. 按索引修改后: " + linkedList);

        // ================= 查:两种 =================
        // 1. 按照值来查 (返回该值首次出现的索引,若不存在返回 -1)
        int indexByValue = linkedList.indexOf("Modified");
        System.out.println("1. 按值查找 'Modified' 的索引: " + indexByValue);

        // 2. 按照下标来查 (获取指定索引位置的元素)
        String valueByIndex = linkedList.get(1);
        System.out.println("2. 按索引查找索引 1 的值: " + valueByIndex);
    }
}

输出:

3.ArrayList和LinkedList的区别

以上就是关于链表的简单介绍!!!!

相关推荐
影寂ldy1 小时前
C# HttpClient 分片下载、断点续传、暂停取消(完整项目知识点)
开发语言·c#
独隅1 小时前
DevEco Code Plan+Build 双 Agent 协同开发效率实测
java·开发语言
Angle.寻梦2 小时前
数据结构--栈与队列
数据结构
KaMeidebaby2 小时前
卡梅德生物技术快报|抗体筛选:抗体筛选中的噬菌体展示四参数调优——从流程设计到数据验证
开发语言·前端·javascript
大黄说说2 小时前
接口频繁超时、报错?后端常见排查思路总结
开发语言·php
跨境小陈2 小时前
2026 年如何使用 Python 抓取 Reddit 数据
开发语言·网络·python
热爱前端的小张2 小时前
第六章 图
数据结构
吃饱了得干活2 小时前
@Transactional 又失效了?把这 8 个坑全填了!
java·后端·spring
dtq04242 小时前
C语言-文件操作1
c语言·开发语言·学习