首页 > 编程语言 >【Java 基础篇】Java LinkedList 详解:数据结构的灵活伙伴

【Java 基础篇】Java LinkedList 详解:数据结构的灵活伙伴

时间:2023-09-23 11:32:16浏览次数:45  
标签:遍历 Java LinkedList 元素 链表 add 数据结构 linkedList


【Java 基础篇】Java LinkedList 详解:数据结构的灵活伙伴_数据结构

在 Java 编程中,数据结构起着至关重要的作用。这些数据结构可以帮助我们组织和管理数据,使我们的代码更加高效和可维护。其中之一是 LinkedList,它是一个灵活的数据结构,允许我们高效地进行插入和删除操作。本篇博客将深入探讨 Java 中的 LinkedList,从基础概念到高级用法,为您呈现全面的信息。

1. 什么是 LinkedList?

LinkedList 是 Java 中的一个双向链表数据结构。它由一系列节点组成,每个节点包含数据元素和指向前一个节点和后一个节点的引用。这种结构使 LinkedList 在插入和删除操作方面非常高效,因为它不需要像数组一样重新分配内存空间。

2. 创建和初始化 LinkedList

在 Java 中,可以使用以下方式创建和初始化 LinkedList

LinkedList<String> linkedList = new LinkedList<>();

这将创建一个空的 LinkedList 对象,用于存储字符串元素。您还可以使用现有集合来初始化 LinkedList,例如:

List<String> stringList = new ArrayList<>();
stringList.add("苹果");
stringList.add("香蕉");

LinkedList<String> linkedList = new LinkedList<>(stringList);

这将创建一个包含 “苹果” 和 “香蕉” 两个元素的 LinkedList

3. 基本操作

3.1 添加元素

3.1.1 add 方法

要向 LinkedList 中添加元素,您可以使用 add 方法。它将元素添加到列表的末尾。

linkedList.add("橙子");

3.1.2 在指定位置添加元素

您还可以使用 add 方法在指定位置插入元素。指定位置是通过索引来确定的,索引从 0 开始。

linkedList.add(1, "葡萄"); // 在索引 1 处插入 "葡萄"

3.2 获取元素

3.2.1 get 方法

要获取 LinkedList 中的元素,可以使用 get 方法,指定元素的索引。

String fruit = linkedList.get(0); // 获取第一个元素

3.3 删除元素

3.3.1 remove 方法

要删除 LinkedList 中的元素,可以使用 remove 方法。可以指定要删除的元素或要删除的元素的索引。

linkedList.remove("香蕉"); // 删除 "香蕉"
linkedList.remove(1); // 删除索引 1 处的元素

4. 遍历 LinkedList

遍历 LinkedList 可以使用不同的方式,最常见的是使用 for-each 循环或迭代器。

4.1 使用 for-each 循环

for (String fruit : linkedList) {
    System.out.println(fruit);
}

4.2 使用迭代器

Iterator<String> iterator = linkedList.iterator();
while (iterator.hasNext()) {
    String fruit = iterator.next();
    System.out.println(fruit);
}

5. 特殊操作

5.1 在开头和末尾添加元素

LinkedList 允许在开头和末尾高效添加元素。

5.1.1 在开头添加元素

linkedList.addFirst("草莓");

5.1.2 在末尾添加元素

linkedList.addLast("樱桃");

5.2 在特定位置插入元素

LinkedList 也允许在特定位置插入元素。

linkedList.add(2, "葡萄"); // 在索引 2 处插入 "葡萄"

5.3 替换元素

您可以使用 set 方法来替换 LinkedList 中的元素。

linkedList.set(1, "蓝莓"); // 将索引 1 处的元素替换为 "蓝莓"

6. 性能考虑

6.1 与 ArrayList 的比较

在考虑使用 LinkedList 时,需要权衡性能。与 ArrayList 相比,LinkedList 在插入和删除操作方面通常更快,因为它不需要移动大量元素。然而,它在随机访问元素时的性能较差,因为需要从头部或尾部开始遍历链表。

6.2 时间复杂度

  • 添加和删除元素:平均时间复杂度为 O(1)(在已知位置的情况下),最坏情况下为 O(n)(如果需要遍历整个链表)。
  • 获取元素:平均时间复杂度为 O(n/2)(在平均情况下,需要遍历一半的链表)。
  • 随机访问元素:最坏情况下为 O(n)(需要从头或尾遍历整个链表)。

7. 使用注意事项

在使用 LinkedList 时,需要注意以下事项:

  • LinkedList 不是线程安全的。如果在多个线程中使用,必须采取适当的同步措施,或者考虑使用线程安全的替代品。
  • 避免过多的随机访问,因为它的性能较差。如果需要频繁的随机访问,请考虑使用 ArrayList
  • 谨慎使用大型 LinkedList,因为它可能会占用大量内存。

8. 高级用法

8.1 双向链表

LinkedList 是一种双向链表的实现,这意味着每个节点都包含指向前一个节点和后一个节点的引用。这种双向连接使得在链表中向前和向后遍历都非常高效。以下是关于双向链表的高级用法示例:

8.1.1 逆序遍历链表

LinkedList 的双向性质使得逆序遍历变得容易。您可以从链表的尾部开始遍历,不断跟随前一个节点的引用,直到达到链表的头部。

LinkedList<String> linkedList = new LinkedList<>();
// 添加元素到链表
// ...
// 逆序遍历链表
ListIterator<String> iterator = linkedList.listIterator(linkedList.size());
while (iterator.hasPrevious()) {
    String item = iterator.previous();
    System.out.println(item);
}

8.1.2 在特定位置插入元素

双向链表的特性使得在特定位置插入元素更加高效,因为您可以从两个方向进行遍历。这可以在需要在链表中间插入元素时提供性能优势。

LinkedList<String> linkedList = new LinkedList<>();
// 添加元素到链表
// ...
// 在中间位置插入元素
ListIterator<String> iterator = linkedList.listIterator(linkedList.size() / 2); // 在中间位置开始
iterator.add("新元素");

8.2 循环链表

LinkedList 也可以用作循环链表,即链表的最后一个节点指向第一个节点,形成一个闭环。这种结构在某些算法和数据结构中非常有用,例如循环队列。

LinkedList<String> circularList = new LinkedList<>();
circularList.add("元素1");
circularList.add("元素2");
circularList.add("元素3");

// 构建循环链表,将最后一个元素指向第一个元素
circularList.getLast().setNext(circularList.getFirst());

// 遍历循环链表
Node<String> currentNode = circularList.getFirst();
do {
    System.out.println(currentNode.getData());
    currentNode = currentNode.getNext();
} while (currentNode != circularList.getFirst());

8.3 链表作为队列和栈

LinkedList 可以用作队列和栈的实现。它支持队列的先进先出(FIFO)和栈的后进先出(LIFO)操作。以下是如何使用 LinkedList 实现队列和栈的示例:

8.3.1 使用链表实现队列

LinkedList<String> queue = new LinkedList<>();
// 入队
queue.offer("元素1");
queue.offer("元素2");
// 出队
String item = queue.poll();

8.3.2 使用链表实现栈

LinkedList<String> stack = new LinkedList<>();
// 入栈
stack.push("元素1");
stack.push("元素2");
// 出栈
String item = stack.pop();

这些高级用法展示了 LinkedList 在各种场景下的灵活性和功能。根据您的需求,您可以充分利用其双向链表的特性来解决问题。

9. 示例代码

以下是一些使用 LinkedList 的示例代码:

// 创建一个 LinkedList
LinkedList<String> linkedList = new LinkedList<>();

// 添加元素
linkedList.add("苹果");
linkedList.add("香蕉");

// 获取元素
String fruit = linkedList.get(0);

// 删除元素
linkedList.remove("香蕉");

// 遍历 LinkedList
for (String item : linkedList) {
    System.out.println(item);
}

10. 总结

LinkedList 是 Java 中强大的数据结构,它在插入和删除操作方面非常高效。但是,在随机访问元素时性能较差,因此需要谨慎选择使用。希望本篇博客能够帮助您更好地理解和使用 LinkedList,并在编写 Java 代码时做出明智的选择。无论您是初学者还是有经验的开发者,掌握 LinkedList 都将为您的编程旅程增添新的工具和技巧。


标签:遍历,Java,LinkedList,元素,链表,add,数据结构,linkedList
From: https://blog.51cto.com/techfanyi/7577145

相关文章

  • java基础——随笔03
    java中this的用法: 一.this关键字1.this的类型:哪个对象调用就是哪个对象的引用类型   二.用法总结1.this.data;//访问属性2.this.func();//访问方法3.this();//调用本类中其他构造方法  三.解释用法1.this.data这种是在成员方法中使用让我们来看看不加this......
  • 无涯教程-JavaScript - LOGNORM.INV函数
    描述LOGNORM.INV函数返回x的对数正态累积分布函数的逆函数,其中ln(x)的分布通常为参数Mean和Standard_dev。如果p=LOGNORM.DIST(x...),则LOGNORM.INV(p...)=x。使用对数正态分布来分析对数转换的数据。语法LOGNORM.INV(probability,mean,standard_dev)争论Argum......
  • 数据结构之 - 链表数据结构详解: 从基础到实现
    链表(LinkedList)是计算机科学中常用的数据结构之一,它具有灵活的内存分配和高效的插入、删除操作。本文将深入介绍链表的特性、基本类型、操作以及在实际应用中的使用场景。1.什么是链表?链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的引用(或指针)。与数......
  • 11-JavaScript 逻辑条件 ,if判断 ,while循环,算数运算相关的案例演示
    1、案例:猜数字设置一个1-10之间的随机数,然后输入进行猜数字,猜的大了怎么样、猜的小了怎么样、猜对了怎么样知识点:设置随机数、if判断、while循环写题思路:1.设置弹框提出问题2.定义一个随机数0-10的数组3.if判断取值的范围,在其范围内反馈的结果4.while循环,直到猜对停止......
  • Linux下Java项目部署
    前置条件​ 阿里云服务器一台(可在购买服务器时勾选安装宝塔选项,免去后面的宝塔安装)​ 设置阿里云服务器密码并登陆服务器​ 以下操作均在服务器Linux中进行(使用远程连接工具登录)宝塔登录登录阿里云服务器在Linux命令行中输入bt,查看宝塔信息​ 根据宝塔信息提供的网站登......
  • 无涯教程-JavaScript - LOGNORM.DIST函数
    描述LOGNORM.DIST函数返回x的对数正态分布,其中ln(x)通常以参数Mean和Standard_dev分布。使用此功能可以分析经过对数转换的数据。语法LOGNORM.DIST(x,mean,standard_dev,cumulative)争论Argument描述Required/OptionalXThevalueatwhichtoevaluatethefunction.......
  • 【数据结构】第四章 多维数组与广义表
    4.1数组的逻辑结构和基本运算数组可看成是一种特殊的线性表,其特殊在于,表中的数组元素本身也是一种线性表。在早期的高级语言中,数组是唯一可供使用的数据类型。由于数组中各元素具有统一的类型,并且数组元素的下标一般具有固定的上界和下界,因此,数组的处理比其他复杂的结构更为简单。......
  • java中如何保证数据库数据的一致性
    本文使用的数据库是mysql一、不考虑并发时的写法假设现在有一张t_product表,我们先只考虑单实例部署时的情况CREATETABLEt_product(idINTPRIMARYKEY,NAMEVARCHAR(50),numsINT);INSERTINTOt_product(id,NAME,nums)VALUES(1,'aa',1);我们现在有一个加库存的接口......
  • 数据结构之 - 深入了解数组数据结构
    数组是计算机科学中最基本且常用的数据结构之一。在本文中,我们将深入介绍数组的特性、操作以及在实际应用中的使用场景。通过全面了解数组,你将能够更好地理解它的原理和如何应用于解决问题。1.什么是数组?数组是一种线性数据结构,它由一系列相同类型的元素组成,这些元素被存储在连续......
  • JavaScript 终于原生支持数组分组了!
    在日常开发中,很多时候需要对数组进行分组,每次都要手写一个分组函数,或者使用lodash的groupBy函数。好消息是,JavaScript现在正在引入全新的分组方法:Object.groupBy和Map.groupBy,以后再也不需要手写分组函数了,目前最新版本的Chrome(117)已经支持了这两个方法!以前的数组分组假设有一......