LinkedList数据结构链表

这篇具有很好参考价值的文章主要介绍了LinkedList数据结构链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LinkedList在Java中是一个实现了ListDeque接口的双向链表。它允许我们在列表的两端添加或删除元素,同时也支持在列表中间插入或移除元素。在分析LinkedList之前,需要理解链表这种数据结构:

  • 链表:链表是一种动态数据结构,由一系列节点组成,每个节点包含数据部分和指向列表中下一个节点的引用。
  • 双向链表:每个节点都有两个链接,一个指向前一个节点,另一个指向后一个节点。

LinkedList 的数据结构

LinkedList中,每个元素都是一个节点,每个节点包含三个部分:存储的数据项、指向前一个节点的引用和指向后一个节点的引用。

private static class Node<E> {
    E item; // 存储的数据
    Node<E> next; // 指向后一个节点的引用
    Node<E> prev; // 指向前一个节点的引用

    Node(Node<E> prev, E element, Node<E> next) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    }
}

LinkedList 的核心方法

LinkedList实现了List接口,所以它具有诸如add, remove, get, set等方法,同时也实现了Deque接口,这意味着它也具有offer, poll, push, pop等方法。

源码解析(简化版)

以下是LinkedList中一些关键方法的简化版源码:

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable {

    transient int size = 0;
    transient Node<E> first;
    transient Node<E> last;

    public LinkedList() {
    }

    public boolean add(E e) {
        linkLast(e);
        return true;
    }

    void linkLast(E e) {
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    }

    public E remove() {
        return unlinkFirst(first);
    }

    private E unlinkFirst(Node<E> f) {
        final E element = f.item;
        final Node<E> next = f.next;
        f.item = null;
        f.next = null; 
        first = next;
        if (next == null)
            last = null;
        else
            next.prev = null;
        size--;
        modCount++;
        return element;
    }

    public E get(int index) {
        checkElementIndex(index);
        return node(index).item;
    }

    Node<E> node(int index) {
        if (index < (size >> 1)) {
            Node<E> x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
            return x;
        } else {
            Node<E> x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }
    }

    // 省略其他细节实现
}

代码演示

下面是LinkedList的一个简单使用示例:

import java.util.LinkedList;

public class Main {
    public static void main(String[] args) {
        LinkedList<String> friends = new LinkedList<>();

        // 添加元素
        friends.add("Alice");
        friends.add("Bob");
        friends.add("Charlie");

        // 打印所有元素
        System.out.println("Initial LinkedList: " + friends);

        // 删除第一个元素
        friends.remove();

        // 打印删除元素后的列表
        System.out.println("After removal: " + friends);

        // 获取特定位置的元素
        String friend = friends.get(1);
        System.out.println("Second friend: " + friend);
    }
}

细节分析

使用LinkedList时,有几个细节需要注意:

  • 动态扩展:由于LinkedList是基于节点的,因此它可以动态地添加或删除节点而不需要像数组那样重新分配整个数据结构。
  • 随机访问效率低:获取特定索引的元素时,LinkedList必须从头开始(或从尾开始,取决于哪边更近)遍历节点。因此,随机访问的效率远低于数组。
  • 插入和删除效率高:在任何位置插入或删除元素时,LinkedList只需要改变几个引用,这使得插入和删除操作非常快速。
  • 内存开销:与数组相比,LinkedList的每个元素都需要额外的内存空间来存储前后节点的引用。

通过以上解析,我们可以深入理解LinkedList的工作原理和设计。这有助于开发者在需要适合的数据结构时作出明智的选择。对于需要频繁插入和删除操作的场景,LinkedList可能是一个不错的选择。然而,如果需要快速通过索引访问元素,那么ArrayList可能是更好的选择。文章来源地址https://www.toymoban.com/news/detail-830057.html

到了这里,关于LinkedList数据结构链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构二】链表和LinkedList详解

    目录 链表和LinkedList  1.链表的实现 2.LinkedList的使用 3.ArrayList和LinkedList的区别 4.链表OJ题训练         当 在 ArrayList 任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后 搬移,时间复杂度为 O(n) ,效率比较低,因此 ArrayList 不适合做任意位置插入和删除比较多

    2024年01月20日
    浏览(46)
  • 数据结构(Java实现)LinkedList与链表(上)

    链表 逻辑结构 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。 无头双向链表:在Java的集合框架库中LinkedList底层实现就是无头双向循环链表。 链表的实现 创建一个链表 遍历单链表 、 得到

    2024年02月11日
    浏览(53)
  • 数据结构(Java实现)LinkedList与链表(下)

    ** ** 结论 让一个指针从链表起始位置开始遍历链表,同时让一个指针从判环时相遇点的位置开始绕环运行,两个指针都是每次均走一步,最终肯定会在入口点的位置相遇。 LinkedList的模拟实现 单个节点的实现 尾插 运行结果如下: 也可以暴力使用 全部代码 MyLinkedList IndexOut

    2024年02月11日
    浏览(46)
  • 【数据结构】_4.List接口实现类LinkedList与链表

    目录 1.链表的结构与特点 1.1 链表的结构: 1.2 链表的特点: 2. 不带头单链表的模拟实现 3. 单链表OJ 3.1 题目1:移除链表元素:  3.2 题目2:反转一个单链表 3.3 题目3:返回链表的中间结点 3.4 题目4:链表的倒数第k个结点 3.5 题目5:合并两个有序链表 3.6 题目6:链表的回文结构

    2024年02月15日
    浏览(45)
  • 【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)

    🎁 单链表的节点中只有一个 next 指针引用着下一个节点的地址 🎁 当要获取单链表中的最后一个元素的时候,需要从头节点开始遍历到最后 🎁 单链表一开始的时候有 first 头指针引用着头节点的地址 💰 双向链表可以提升链表的综合性能 💰 双向链表的节点中有 prev 指针引

    2024年02月12日
    浏览(46)
  • [Collection与数据结构] 链表与LinkedList (一):链表概述与单向无头非循环链表实现

    上篇文章我们已经对顺序表进行了实现,并且对ArrayList进行了使用,我们知道ArrayList底层是使用数组实现的. 由于其底层是一段连续空间,当在ArrayList任意位置插入或者删除元素时, 就需要将后序元素整体往前或者往后搬移,时间复杂度为O(n),效率比较低 ,因此ArrayList不适合做

    2024年04月26日
    浏览(65)
  • 第14章_集合与数据结构拓展练习(前序、中序、后序遍历,线性结构,单向链表构建,单向链表及其反转,字符串压缩)

    1、前序、中序、后序遍历 分析: 完全二叉树: 叶结点只能出现在最底层的两层,且最底层叶结点均处于次底层叶结点的左侧 2、线性结构 3、其它 4、单向链表构建 (1)定义一个单向链表SingleLinked类 包含私有的静态内部类Node 包含Object类型的data属性和Node类型的next属性 包含

    2024年01月23日
    浏览(50)
  • Java 【数据结构】 LinkedList【神装】

      登神长阶 第二神装    LinkedList   目录 🕶️一.LinkedList 🥼1.简介  🦺2.LinkedList具体使用 👔2.1.构造方法 👕2.2.常见操作 👘2.3.遍历 🧢三.LinkedList的优缺点 与ArrayList的比较 🪖四.总结与反思 在集合框架中,LinkedList是一个普通的类,实现了List接口,具体框架图如下: 说明

    2024年04月14日
    浏览(40)
  • Java:ArrayList集合、LinkedList(链表)集合的底层原理及应用场景

    入队 出队 压栈(push),addFirst可以替换成push,官方专门为压栈写了push的API 出栈(pop),removeFirst可以替换成pop,官方专门为出栈写了pop的API

    2024年02月12日
    浏览(40)
  • Java 中数据结构LinkedList的用法

    链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。 链表可分为单向链表和双向链表。 一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接。 一个双向链表有三个整

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包