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的区别

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

相关推荐
程序员黑豆7 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
风流 少年8 小时前
Spring AI 2.0:Memory
java·后端·spring
码匠许师傅8 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
2603_965148118 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
小席是个热心肠9 小时前
AI相关的自我学习
java·人工智能·学习
知无不研11 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
数智化管理手记11 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能
cfm_291412 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
鲸采云SRM采购管理系统13 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库
C++ 老炮儿的技术栈13 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐