Java LinkedList 详解

LinkedList 是 Java 集合框架中常用的数据结构之一,位于 java.util 包中。它实现了 ListDequeQueue 接口,是一个双向链表结构,适合频繁的插入和删除操作。


1. LinkedList 的特点

  1. 数据结构:基于双向链表实现,每个节点包含:

    • 数据部分(存储值)。
    • 前驱指针(指向前一个节点)。
    • 后继指针(指向后一个节点)。
  2. 实现接口

    • List:支持按索引随机访问、插入和删除操作。
    • Deque:支持双端队列操作。
    • Queue:支持队列操作。
  3. 操作特性

    • 插入和删除效率高:在头部或尾部插入和删除操作的时间复杂度为 O ( 1 ) O(1) O(1)
    • 随机访问效率低:需要遍历链表查找元素,时间复杂度为 O ( n ) O(n) O(n)

2. LinkedList 的构造方法

LinkedList 提供了以下两种构造方法:

  1. 无参构造

    LinkedList<Integer> list = new LinkedList<>();
    

    创建一个空的链表。

  2. 带集合参数的构造

    List<Integer> arrayList = Arrays.asList(1, 2, 3);
    LinkedList<Integer> list = new LinkedList<>(arrayList);
    

    使用另一个集合初始化链表。


3. 常用方法

LinkedList 继承了 ListDeque 的所有方法。以下是常用方法的分类及示例:

3.1 添加元素
  • 尾部添加
    list.add(10);  // 在尾部添加元素
    
  • 指定位置添加
    list.add(1, 20);  // 在索引 1 处插入元素 20
    
  • 头部添加
    list.addFirst(5);  // 在头部添加元素
    
  • 尾部添加
    list.addLast(15);  // 在尾部添加元素
    

3.2 删除元素
  • 删除头部元素
    list.removeFirst();  // 删除并返回头部元素
    
  • 删除尾部元素
    list.removeLast();  // 删除并返回尾部元素
    
  • 删除指定位置元素
    list.remove(2);  // 删除索引 2 处的元素
    
  • 删除指定值
    list.remove(Integer.valueOf(10));  // 删除第一个匹配值为 10 的元素
    

3.3 获取元素
  • 头部或尾部元素
    list.getFirst();  // 返回头部元素
    list.getLast();   // 返回尾部元素
    
  • 指定位置元素
    list.get(2);  // 返回索引 2 处的元素
    

3.4 检查元素
  • 是否包含某个元素
    list.contains(20);  // 检查链表是否包含值为 20 的元素
    
  • 是否为空
    list.isEmpty();  // 检查链表是否为空
    

3.5 迭代元素
  • 普通 for 循环
    for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));
    }
    
  • 增强 for 循环
    for (Integer num : list) {System.out.println(num);
    }
    
  • 使用迭代器
    Iterator<Integer> iterator = list.iterator();
    while (iterator.hasNext()) {System.out.println(iterator.next());
    }
    

3.6 双端队列操作

LinkedList 实现了 Deque 接口,支持双端队列的操作。

  • 入队(头部或尾部)
    list.offerFirst(1);  // 在头部添加元素
    list.offerLast(2);   // 在尾部添加元素
    
  • 出队(头部或尾部)
    list.pollFirst();  // 删除并返回头部元素
    list.pollLast();   // 删除并返回尾部元素
    

3.7 栈操作

LinkedList 也可以用作栈,支持栈的基本操作。

  • 压栈
    list.push(10);  // 将元素压入栈顶(头部)
    
  • 出栈
    list.pop();  // 弹出栈顶元素(头部)
    

4. 示例代码

以下是一个综合使用 LinkedList 的示例:

import java.util.LinkedList;public class LinkedListExample {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();// 添加元素list.add(10);list.add(20);list.add(30);list.addFirst(5);list.addLast(40);System.out.println("链表内容: " + list);// 删除元素list.removeFirst();list.removeLast();list.remove(Integer.valueOf(20));System.out.println("删除元素后的链表: " + list);// 获取元素System.out.println("头部元素: " + list.getFirst());System.out.println("尾部元素: " + list.getLast());// 检查元素System.out.println("是否包含 30: " + list.contains(30));// 使用栈操作list.push(50);  // 压栈System.out.println("压栈后的链表: " + list);list.pop();     // 出栈System.out.println("出栈后的链表: " + list);// 使用队列操作list.offerFirst(5);  // 入队头部list.offerLast(60);  // 入队尾部System.out.println("使用队列操作后的链表: " + list);// 遍历元素System.out.println("遍历链表:");for (Integer num : list) {System.out.println(num);}}
}

输出

链表内容: [5, 10, 20, 30, 40]
删除元素后的链表: [10, 30]
头部元素: 10
尾部元素: 30
是否包含 30: true
压栈后的链表: [50, 10, 30]
出栈后的链表: [10, 30]
使用队列操作后的链表: [5, 10, 30, 60]
遍历链表:
5
10
30
60

5. LinkedList 的时间复杂度

操作时间复杂度原因
插入(头部/尾部) O ( 1 ) O(1) O(1)双向链表操作,直接修改指针即可
删除(头部/尾部) O ( 1 ) O(1) O(1)双向链表操作,直接修改指针即可
按索引访问元素 O ( n ) O(n) O(n)需要从头部或尾部遍历到指定位置
查找某个元素 O ( n ) O(n) O(n)遍历整个链表
插入/删除(中间位置) O ( n ) O(n) O(n)需要先遍历找到位置,然后修改指针

6. LinkedList 的优缺点

优点
  1. 适合频繁插入和删除操作。
  2. 实现了多种接口(ListDequeQueue),功能强大。
  3. 支持双端操作(头部和尾部操作都高效)。
缺点
  1. 随机访问性能差,需要遍历链表,时间复杂度为 O ( n ) O(n) O(n)
  2. 占用额外的内存空间(指针存储前驱和后继节点)。

7. 总结

  • 适用场景

    • 数据插入和删除频繁的场景(如队列、栈操作)。
    • 数据大小较小,链表的额外内存开销可以接受。
  • 不适用场景

    • 随机访问频繁的场景(推荐使用 ArrayList
      )。

通过合理选择数据结构,可以根据具体需求提高程序性能和代码效率。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Spring IOCDI

1. 什么是Spring 前面介绍了Spring Boot&#xff0c;Spring MVC&#xff0c;那么Spring和他们之间有什么关系呢&#xff1f; Spring简单一句话总结就是&#xff1a;它是一个包含众多工具方法的IOC容器。前面我们也接触过容器&#xff0c;比如List/Map&#xff0c;他俩是数据存…

螺旋矩阵II(leetcode 59)

转圈过程&#xff08;边界处理&#xff09;遵循循环不变量的原则&#xff0c;坚持一个原则处理每一条边&#xff0c;左闭右开处理 class Solution { public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> num(n, vector<int>…

Vue 中的透传,插槽,依赖注入

1. 透传attributes 在组件上使用透传attribute&#xff1a; 当你在父组件中使用子组件时&#xff0c;你可以添加一些attribute到子组件上&#xff0c;即使这些attribute没有在子组件的props中声明。 父组件&#xff1a; <!-- 父组件&#xff0c;例如 ParentComponent.vue…

基于K8S1.28.2实验rook部署ceph

基于K8S1.28.2实验rook部署ceph 原文链接&#xff1a; 基于K8S1.28.2实验rook部署ceph | 严千屹博客 Rook 支持 Kubernetes v1.22 或更高版本。 rook版本1.12.8 K8S版本1.28.2 部署出来ceph版本是quincy版本 主机名ip1(NAT)系统新硬盘磁盘内存master1192.168.48.101Centos7.910…

node.js中express的基本了解

定义 Express是基于Node.js平台&#xff0c;快速、开放、极简的Web开发框架。 本质 Express是一个npm上的第三方包&#xff0c;提供了快速创建Web服务器的便捷方法。 作用 与Node.js内置的http模块类似&#xff0c;Express也是专门用来创建Web服务器的&#xff0c;但它极大地简…

容器运行时 AND Docker

容器运行时 and Docker 什么是Docker Docker 使用 Google 公司推出的 Go 语言 进行开发实现&#xff0c;基于 Linux 内核的 cgroup&#xff0c;namespace&#xff0c;以及 AUFS 类的 Union FS 等技术&#xff0c;对进程进行封装隔离&#xff0c;属于 操作系统层面的虚拟化技术…

基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络

一、介绍 垃圾识别分类系统。本系统采用Python作为主要编程语言&#xff0c;通过收集了5种常见的垃圾数据集&#xff08;‘塑料’, ‘玻璃’, ‘纸张’, ‘纸板’, ‘金属’&#xff09;&#xff0c;然后基于TensorFlow搭建卷积神经网络算法模型&#xff0c;通过对图像数据集进…

Scala-数据类型-概述(Scala 3.x 类型层次结构)

Scala Scala-数据类型 Scala1. Any — 顶级类型2. Matchable — 匹配类型3. AnyVal — 值类型的父类4. AnyRef — 引用类型的父类5. Null - 引用类型的子类型Tips: 为什么 null 不推荐使用&#xff1f; 6. Nothing - 底层类型 (Bottom Type)整理不易&#xff0c;对您有帮助的话…

Linux:权限相关知识详解

1.shell命令以及运行原理 1.1初步理解认识shell Linux严格意义上说的是一个操作系统&#xff0c;我们称之为“核心&#xff08;kernel&#xff09;“ &#xff0c;但我们一般用户&#xff0c;不能直接使用kernel。而是通过kernel的“外壳”程序&#xff0c;也就是所谓的shell&…

React中常用的钩子

在当今&#xff0c;React的钩子写法已经逐渐成为了一种主流开发模式&#xff0c;本文将介绍几种在React中常用的钩子 useState 可以用来双向绑定&#xff0c;创建需要监听变化并且使用的数据 使用该钩子定义时&#xff0c;参数可以是一个直接定义好的变量&#xff0c;也可以是…

.NET SDK 各操作系统开发环境搭建

一、Win10&#xff08;推荐&#xff09; 1、VS 2022 社区版 # 下载地址 https://visualstudio.microsoft.com/zh-hans/downloads/ 2、.NET 6 SDK # 下载地址 https://dotnet.microsoft.com/zh-cn/download/dotnet/6.0 3、Hello World 如果需要使用旧程序样式时&#xff0c;则…

Linux 下网络套接字(Socket) 与udp和tcp 相关接口

文章目录 1. socket常见API2 sockaddr结构体及其子类1. sockaddr结构体定义&#xff08;基类&#xff09;2. 子类 sockaddr_in结构体用于(IPv4)3 子类 sockaddr_un(Unix域套接字)4. 总结画出其结构体 3.实现一个简单的tcp Echo 服务器和客户端(cpp&#xff09;3.1 客户端3.2 服…

跨平台WPF框架Avalonia教程 七

数据绑定 Avalonia使用数据绑定将数据从应用程序对象传递到UI控件&#xff0c;根据用户输入更改应用程序对象中的数据&#xff0c;并在响应用户命令时对应用程序对象进行操作。 在这种安排中&#xff0c;控件是绑定目标&#xff0c;而对象是数据源。 Avalonia运行数据绑定系统…

日常ctf

1&#xff0c; [陇剑杯 2021]日志分析&#xff08;问1&#xff09; %2e 为URL编码的符号 "." flag{www.zip} 2&#xff0c; [陇剑杯 2021]日志分析&#xff08;问2&#xff09; 根据之前题目的分析&#xff0c;在获取到源码文件之后&#xff0c;黑客又成功访问了in…

基于微信小程序的校园助手+LW示例参考

1.项目介绍 项目角色&#xff1a;管理员、普通用户功能模块&#xff1a;管理员&#xff08;用户管理、寻物启事管理、物品分类管理、表白广场、吐槽大会、二手交易、拼车出行等&#xff09;、普通用户&#xff08;登录注册、寻物启事、失物招领、表白广场、吐槽大会、拼车出行…

逆向攻防世界CTF系列38-xxxorrr

逆向攻防世界CTF系列38-xxxorrr 64位无壳&#xff0c;很自然的找到main和一个比较函数 以为逻辑很简单了 enc [0x56, 0x4E, 0x57, 0x58, 0x51, 0x51, 0x09, 0x46, 0x17, 0x46,0x54, 0x5A, 0x59, 0x59, 0x1F, 0x48, 0x32, 0x5B, 0x6B, 0x7C,0x75, 0x6E, 0x7E, 0x6E, 0x2F, 0…

数据结构-堆排序笔记

1 思路 总体思路 首先我们会拿到一个无序的数组&#xff0c;我们需要先对其构建成一个堆。下面我们示例将会构建成大顶堆。然后我们对顶堆的元素进行位置之间的交换。交换的同时继续对其维护大顶堆的性质&#xff0c;直至大顶堆只剩下一个元素。 具体思路 首先我们先将一个…

如何在react中使用react-monaco-editor渲染出一个编辑器

一、效果展示 二、基于vite配置 1.首先安装react-monaco-editor和monaco-editor包 npm add react-monaco-editor npm i monaco-editor 2.其次创建一个单独的文件&#xff08;此处是tsx、直接用app或者jsx也行&#xff09; import { useState, useEffect } from react impo…

跨平台WPF框架Avalonia教程 六

添加交互性 用户界面的一个基本功能是与用户进行交互。在Avalonia中&#xff0c;您可以通过使用事件和命令来为应用程序添加交互性。本指南将通过简单的示例介绍事件和命令。 处理事件​ Avalonia中的事件提供了一种响应用户交互和控件特定操作的方式。您可以按照以下步骤处…

【传知代码】VRT_ 关于视频修复的模型

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ VRT_ 关于视频修复的模型 背景介绍&#xff1a;重要性&#xff1a; VRT的重要性和研究背景VRT的背景&#xff1a;VRT的重要性&#xff1a; 视…