LinkedList底层链表结构

  • 前言概述
  • 核心代码
  • 效果展示

第一章 前言概述

第01节 简述说明

LinkedList 底层

LinkedList 底层采用的是 双向链表完成,特点是 增删快,查询慢。

LinkedList 体系

第02节 特有方法

说明

在 LinkedList 当中,包含有大量的操作头和尾的方法。
例如:1. 添加头、添加尾2. 删除头、删除尾3. 查询头、查询尾

方法

【1】添加相关的方法public void addFirst(E e){ .... }    //添加头public void addLast(E e) { .... }    //添加尾public void push(E e){ .... }       //添加头(底层调用的也是添加头的方法)将元素压入到集合的0号索引位置【2】删除相关的方法public E removeFirst() { .... }     //删除头public E removeLast() {  .... }     //删除尾public E pop() { ..... }          //删除尾(底层调用的也是删除尾的方法)删除掉最后一位索引位置的元素【3】获取相关的方法public E getFirst(){ .... }           //获取头public E getLast() { .... }        //获取尾

第二章 核心代码

第01节 成员变量

成员变量相关的核心代码

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() {}/*** 带参数构造方法,当前方法会调用 addAll()方法,* 此方法来自于祖父接口 Collection接口,表示将 c集合当中的数据添加到 LinkedList集合对象当中* 例如:*     Collection<String> c = new ArrayList<>();*     c.add("hello");*     c.add("world");* 当我们创建 LinkedList集合对象的格式如下的时候*      LinkedList<String> linked = new LinkedList<>(c);*     那么在 linked 当中包含的数据就是 "hello" 和 "world"*/public LinkedList(Collection<? extends E> c) {this();addAll(c);}/***  来自于 LinkedList 底层的内部类,主要是记录节点的对象*  记录的数据包括三部分:  item  next  prev*  成员变量 E item: 这里的 item 的泛型是 E 表示当前存放的元素*  成员变量 Node<E>  next:  这里的 next 表示的是下一个节点的对象*  成员变量 Node<E>  prev:  这里的 prev 表示的是上一个节点的对象*/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;}}
}

链表的效果图(理解Node内部类)

第02节 成员方法

核心代码

public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{/*** 将指定的元素追加到此列表的末尾,这个方法等效于 void addLast(E e) 方法* 参数e: 表示要添加到此列表的元素* 返回值是 true 表示无论什么元素都能添加成功,因为是List系列的集合,假如是Set系列的则可能会为false* 方法体当中调用的是 下面的 linkLast(e) 这个方法*/public boolean add(E e) {linkLast(e);return true;}/*** 将参数 e 添加到linkedList集合的最后* final Node<E> l = last 表示的是记录当前尾节点的数据值,这里的 last 是成员变量* Node<E> newNode = new Node<>(l, e, null)  表示创建新的节点对象,将l和e作为参数传入* last = newNode  表示记录 last 的值是最新对象的地址值* if (l == null)  判断是否为null 如果是null则表示是第一个元素,那么就记录 first=newNode* 否则记录  l.next = newNode; 表示不是第一个节点,则记录为 l.next=newNode* 当做好记录之后,长度 size 自增,来自于父类的变量 modCount 自增*/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;elsel.next = newNode;size++;modCount++;}
}

第三章 效果展示

第01节 案例代码

public class Test {public static void main(String[] args) {LinkedList<String> linked = new LinkedList<>();linked.add("aa");linked.add("bb");linked.add("cc");linked.add("dd");System.out.println(linked); //[aa, bb, cc, dd]}
}

第02节 过程实现

核心代码分析

核心方法分析

//说明: first 和 last 都是LinkedList 集合的成员变量Node<E>的对象
void linkLast(E e) {//这里的 l 记录的是 last 当中的地址信息,刚开始的时候 last 记录的是null  final Node<E> l = last;//这里的 newNode 就是创建的节点的对象,记录的节点的地址值,例如地址值 0x01final Node<E> newNode = new Node<>(l, e, null);//这里将节点记录的地址值,赋值给了 last 那么last当中记录地址,也就是 0x01last = newNode;//判断之前记录的l是否为null, 如果是第一个元素,之前没有 l 则为 null if (l == null)//当第一个元素的时候,LinkedList的成员变量 first 就记录为 上面地址 0x01first = newNode;else//如果不是null, 则表示之前存在对象,那么前一个对象的下一个节点就记录地址 0x01l.next = newNode;//当上面的内容记录完毕之后,长度 size改变, 父类成员变量modCount值也改变size++;modCount++;
}

小结说明

  1. 这里的变量 l 记录的是上一个节点 Node 的地址值,如果是第一个元素,则 lnull
  2. 这里的变量 newNode 对象当中,包含着三个部分,分别是 前一个节点的地址值、当前的元素值、下一个节点的地址值
  3. 两个变量 firstlast 都是 LinkedList 集合当中维护的成员变量,他们的类型都是 Node<E> 这种类型

图一(添加第一次数据)

图二(添加第二次数据)

图三(添加第三次数据)

图四(添加第四次数据)

第03节 动态效果

LinkedList底层链表结构相关推荐

  1. 手写LinKedList双向链表 终于搞清了什么是链表结构

    之前对Collection这块底层实现和异同点一直模糊不清,最近手动写了个链表结构实现LinKedList ,发现很多知识还是要不断去实践,专研,才能不断提升. LinKedList 实现 List接 ...

  2. linkedlist链表结构原理

    一.LinkedList实现原理概述 LinkedList 和 ArrayList 一样,都实现了 List 接口,但其内部的数据结构有本质的不同.LinkedList 是基于链表实现的(通过名字也能 ...

  3. java arraylist底层实现原理_ArrayList和LinkedList底层原理

    ArrayList和LinkedList都是List的实现类,是在日常开发中经常被使用到的两个集合,我们来结合源码看下两个集合的不同之处. 先来看下ArrayList的源码: // 默认的初始化大小p ...

  4. 数据结构(数组结构、链表结构)

    本来第一篇文章准备写点关于map的,但是考虑到map中可能也牵扯到数据结构,所以先随便写点就当做铺垫吧! 数据结构: 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合 1.集合 数据结构中的 ...

  5. Java集合(五)LinkedList底层扩容源码分析

    LinkedList的全面说明: (1)LinkedList底层实现了双向链表和双端队列特点 (2)可以添加任意元素(元素可以重复),包括null. (3)线程不安全,没有实现同步 LinkedLis ...

  6. php要求掌握链表结构吗,PHP 链表结构之单链表(一)

    php链表结构,单链表(一) 单链表结构,我们这边定义一个节点类,属性有当前值(data)和指向下一个节点的(next) class ListNode { public $data = NULL; p ...

  7. 【python】关于python的链表结构实现

    [参考] [https://blog.csdn.net/weixin_37728031/article/details/81145258][注意链表结构,节点包括数值和next.链表中的head] [ ...

  8. 详解java集合之LinkedList——底层实现是头尾、双向节点,尽情地问我有没有看过集合源码吧!

    LinkedList底层实现--头尾.双向节点    LinkedList的类继承结构图 1. LinkedList对象的创建 1.1 参数为空的构造方法的方法体为空. 1.2 Collection对 ...

  9. ArrayList 与 LinkedList 底层实现

    ArrayList 与 LinkedList 都是List 类型的容器,保存数据的同时也维持着它们插入元素的顺序,LinkedList 提供了更多的方法来操作其中的数据,但是这并不意味着要优先使用Li ...

最新文章

  1. 关于System.InvalidOperationException异常
  2. 左转待转区----当同向直行信号灯绿灯亮时,左转弯的车辆进入左转待转区等候放行信号(即使此时左转弯灯是红色的) 注意:当直行红灯时候禁止进入...
  3. 学生信息管理系统(连接数据库,面向对象的方法实现学生信息的增删改查操作)...
  4. 强烈推荐:Spring 核心知识点总结.pdf
  5. ubuntu 允许root用户登陆ssh
  6. 大话javascript 2期:执行上下文与执行上下文栈
  7. 怎样用JS来添加CSS样式
  8. python读取多通道信号中的一个通道_RFID多通道读写器的具体应用
  9. Auto.js 全命令整理(二) 对应用命令专题
  10. 适合程序员的机器人编程c语言,技术干货六:机器人编程的C++基础知识
  11. 基于SpringCloud Alibaba实现的论坛
  12. ctfmon是什么启动项_Win7启动项找不到ctfmon进程无法正常使用输入法的解决方法...
  13. WeChat for Linux
  14. windows下安装python-pcl及其问题解决办法
  15. 解决Hash冲突四种方法
  16. 更新至2021各省份上传服务器地址(航信、百旺、税务UK)
  17. c语言-计算摄氏温度
  18. 桌面计算机图标带虚线框,win10系统桌面图标有虚线框的操作方法
  19. Java进阶(一)面向对象进阶简介
  20. 长链剖分(知识点整理+板子总结)

热门文章

  1. 如何用70行Java代码实现深度神经网络算法
  2. IELTS12 TEST8 allow children to make their own choices on everyday matters
  3. Multi-Modal
  4. 单片机看门狗c语言,单片机看门狗程序
  5. 03-docker系列-docker容器的基本操作
  6. Fast Abstractive Summarization with Reinforce-Selected Sentence Rewriting
  7. 教你使用caret包(一)--数据预处理
  8. 机器学习之R语言caret包trainControl函数(控制调参)
  9. 中序遍历二叉树-非递归方式实现-附C++代码
  10. 面向对象编程及其三大特征(JAVA)