IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LinkedList的实现原理(阅读书籍<Java编程的逻辑>) -> 正文阅读

[数据结构与算法]LinkedList的实现原理(阅读书籍<Java编程的逻辑>)

LinkedList特点分析:
用法上,LinkedList是一个List,但也实现了Deque接口,可以作为队列、栈和双端队列使用,实现原理上,LinkedList内部是一个双向链表。并维护了长度、头节点、和尾结点,如图所示可以看出
在这里插入图片描述因此这决定了它有如下特点:
1)按需分配空间,不需要预先分配很多空间。
2)不可以随机访问,按照索引位置访问效率比较低,所以必须从头或尾顺着链接找,效率为O(N/2).
3) 不管列表是否已经排序,只要是按照内容查找元素,效率都比较低,必须逐个比较,效率为O(N)
4) 在两端添加、删除元素的效率很高,为O(1)。
5)在中间插入、删除元素,要先定位,效率比较低,为O(N),但修改本身的效率很高,效率为O(l)。

1.内部组成
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的内部组成就是如下三个实例变量:

transient int size = 0;  // size表示链表长度,默认为0

    /**
     * Pointer to first node.
     * Invariant: (first == null && last == null) ||
     *            (first.prev == null && first.item != null)
     */
    transient Node<E> first;  // 指向头节点

    /**
     * Pointer to last node.
     * Invariant: (first == null && last == null) ||
     *            (last.next == null && last.item != null)
     */
    transient Node<E> last;  // 指向尾结点

2.add方法

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

主要是调用了LinkLast(e)方法,它的代码为:

void linkLast(E e) {
        final Node<E> l = last;  // 1.创建一个新的节点newNode。l和last指向原来的尾结点
        final Node<E> newNode = new Node<>(l, e, null); // 2.如果链表为空,则为null.
        last = newNode; // 3.修改尾结点last,指向新的最后节点newNode。
        if (l == null) // 4.修改前节点的后向链接,如果原来链表为空
            first = newNode; // 则让头节点指向新节点,
        else
            l.next = newNode;  // 否则让前一个节点的next指向新节点。
        size++; // 5.增加链表大小
        modCount++;  //6.记录修改次数,便于迭代中间检测结构型变化
    }

我们可以通过图示来进行介绍:

public static void main(String[] args) {
        LinkedList<String> linkedList = new LinkedList<String>();
        linkedList.add("简单爱");
        linkedList.add("轨迹");
    }

执行完第一行代码后LinkedList内部结构如图:

在这里插入图片描述
添加第一个元素后LinkedList对象内部结构:(这里画图出现失误,size的大小改为1)

在这里插入图片描述
添加两个元素后对象内部结构:
在这里插入图片描述
以上图片所示可以看出LinkedList是按需分配的,不需要预先分配多余的内存,添加元素只需分配新元素的空间,然后调节几个链接即可。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-24 18:28:41  更:2022-05-24 18:30:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:24:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码