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

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

相关推荐
金銀銅鐵40 分钟前
为什么枚举类中可以定义抽象方法
java·后端·ai编程
xiaoye-duck2 小时前
《C++ 项目:手写大模型接入 SDK》Gemini接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
文丑颜不良啊2 小时前
LeetCode1941~1960题目解析
java·leetcode
txxzjmzlh2 小时前
SpringBoot 统⼀功能处理
java·spring boot·后端
nice_lcj5204 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
码农小河665 小时前
基于SSM+JSP+MySQL的在线医疗服务系统的设计与实现
java·开发语言·mysql
老师我太想进步了20265 小时前
【数据结构-4】算法美学之顺序表
数据结构·算法
SL_staff6 小时前
从配置失效到逻辑复用:JVS-Logic 如何构建可治理的业务编排中枢
java·spring·产品
特立独行的猫A6 小时前
一份 Markdown 发十个平台:cspub 一稿多投
java·后端·python
文丑颜不良啊7 小时前
LeetCode1961~1980题目解析
java·leetcode