LinkedList是常用的集合结构之一,数据存储结构为链式存储,每个节点都有元素、前指针和后指针,指针指向了前节点和后节点的位置。同是LinkedList也是一个队列,实现了Deque接口,Deque接口继承了Queue接口。

1.7以前为双向循环链表,之后没有循环了哦。

队列出入顺序为FIFO,插入的位置是队列的尾部,而移出的位置是队头,Queue接口提供了offer()入列,和poll()出列的方法。

LinkedList的add(E e)方法:
public boolean add(E var1) {
this.linkLast(var1);
return true;
} 再来看this.linkLast(var1)方法: void linkLast(E var1) {
LinkedList.Node var2 = this.last; //内部初始提供了first和last两个节点
LinkedList.Node var3 = new LinkedList.Node(var2, var1, (LinkedList.Node)null); //构造一个新的Last节点,前指针指向原来的last节点var2 ,后指针为null
this.last = var3; //将var3 赋值给last节点
if (var2 == null) { //var2 为空 表示整个LinkedList没有任何元素,第一次加入,此时first节点和last节点都为var3
this.first = var3;
} else { //不为空则将原last节点的后指针指向var3
var2.next = var3;
} ++this.size;
++this.modCount;
}
LinkedList的add(int var1, E e)方法
public void add(int var1, E var2) {
this.checkPositionIndex(var1); //var1范围检查
if (var1 == this.size) { //如果var1==size 则直接再末尾添加一个节点
this.linkLast(var2);
} else {
this.linkBefore(var2, this.node(var1)); //这里node方法找到var1下标对应的元素,在此元素前面插入新节点
} }
LinkedList.Node<E> node(int var1) {
LinkedList.Node var2;
int var3;
if (var1 < this.size >> 1) { //判断var1和中位值的大小,小于则从first节点开始向后遍历,大于则从last节点开始向前遍历
var2 = this.first; for(var3 = 0; var3 < var1; ++var3) {
var2 = var2.next;
} return var2;
} else {
var2 = this.last; for(var3 = this.size - 1; var3 > var1; --var3) {
var2 = var2.prev;
} return var2;
}
}
void linkBefore(E var1, LinkedList.Node<E> var2) {
LinkedList.Node var3 = var2.prev;
LinkedList.Node var4 = new LinkedList.Node(var3, var1, var2);
var2.prev = var4;
if (var3 == null) { //若只有一个元素,则first节点为null
this.first = var4;
} else {
var3.next = var4;
} ++this.size;
++this.modCount;
}

再来看一下重写的offer和poll方法

public boolean offer(E var1) {
return this.add(var1);
}
插入的时候调用的是linkLast方法,及last节点为入列口,是队尾 public E poll() {
LinkedList.Node var1 = this.first;
return var1 == null ? null : this.unlinkFirst(var1);
}
移除的时候调用了this.unlinkFirst(var1)方法
private E unlinkFirst(LinkedList.Node<E> var1) {
Object var2 = var1.item; //获取first节点的数据返回
LinkedList.Node var3 = var1.next; //first节点的last节点
var1.item = null; //help GC
var1.next = null; //first节点的next节点指向null
this.first = var3; //现在first节点为var3
if (var3 == null) { //如果为null 则说明最开始first没有next元素,链表为空或者只有一个first元素,现在移除了first元素,链表里没有元素了,last为null
this.last = null;
} else { //first节点的prev节点为null
var3.prev = null;
} --this.size;
++this.modCount;
return var2;
}

LinkedList - 好一个双向链表的更多相关文章

  1. 跟踪LinkedList源码,通过分析双向链表实现原理,自定义一个双向链表

    1.LinkedList实现的基本原理 LinkedList是一个双向链表,它主要有两个表示头尾节点的成员变量first  .last,因其有头尾两个节点,所以从头或从尾操作数据都非常容易快捷.Lin ...

  2. 使用LinkedList模拟一个堆栈或者队列数据结构

    使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出  如同一个杯子. 队列:先进先出  如同一个水管. import java.util.LinkedList; public cl ...

  3. Java LinkedList特有方法程序小解 && 使用LinkedList 模拟一个堆栈或者队列数据结构。

    package Collection; import java.util.LinkedList; /* LinkedList:特有的方法 addFirst()/addLast(); getFirst( ...

  4. C语言一个双向链表的实现

    首先编写头文件,头文件里做相关的定义和声明,DList.h内容如下: #ifndef DList_H #define DList_H typedef int Item; typedef struct ...

  5. Java实现一个双向链表的倒置功能

    题目要求:Java实现一个双向链表的倒置功能(1->2->3 变成 3->2->1) 提交:代码.测试用例,希望可以写成一个Java小项目,可以看到单元测试部分 该题目的代码, ...

  6. Queue接口的实现类竟然有一个是LinkedList,一个是优先队列(同一个接口,只改了不同的实现类,附源码)

    输出是: Queue接口底层换一个实现类,照样的是调用Queue接口中的方法 import java.util.HashMap; import java.util.LinkedList; import ...

  7. 用 LinkedList 实现一个 java.util.Stack 栈

    用 LinkedList 实现一个 java.util.Stack 栈 import java.util.LinkedList; public class Stack<E> { priva ...

  8. 【Java基础】用LinkedList实现一个简单栈的功能

    栈的基本功能 栈的最基本功能是保障后进先出,然后在此基础上可以对在栈中的对象进行弹入弹出,此外,在弹出时,如果栈为空,则会报错,所以还需要提供获取当前栈大小的方法. 构造存储对象Student /** ...

  9. java 使用LinkedList模拟一个堆栈或者队列数据结构

    近期在复习下java基础,看了下java基础,在看到集合时突然发现想起来曾经面试有一道笔试题:模拟一个堆栈或者队列数据结构,当时还没做出来,今天就写一下,首先得明确堆栈和队列的数据结构 堆栈:先进后出 ...

随机推荐

  1. java面试题复习(二)

    //我又回来了 11.数组有没有length()方法?String有没有length()方法? 数组只有length属性,String有length()方法.注意:JavaScript获取字符串长度使 ...

  2. 关于css 的兼容设置 ----笔记

    在开发网页的时候,由于浏览器的差异,会造成css 代码需要写不同的样式,才能适配大部分浏览器,这很烦,但是又不得不做,我把其中用得比较多的那些,做了一个归纳,放在这里,开发的时候,直接打开这里,复制粘 ...

  3. a 标签实现分享功能

    在网页中,经常会用到分享功能,例如分享到qq,分享到微信,分享到微博等,但是怎么实现呢?一直没有想清楚这个问题,觉得好高大上的样子,于是在网上找了一些资料,也没有看出个什么所以然来: 于是有些心急了, ...

  4. Ceph 集群整体迁移方案(转)

    场景介绍:在我们的IDC中,存在着运行了3-6年的Ceph集群的服务器,这些服务器性能和容量等都已经无法满足当前业务的需求,在购入一批高性能机器后,希望将旧机器上的集群整体迁移到新机器上,当然,是保证 ...

  5. Sql Server数据库之触发器

    阅读目录 一:触发器的优点 二:触发器的作用 三:触发器的分类 四:触发器的工作原理 五:创建触发器 六:管理触发器 概念:   触发器(trigger)是SQL server 提供给程序员和数据分析 ...

  6. Windows下pip 离线包安装

    pip在线安装十分方便,有时候某些服务器并没有直接联网,需要下载好安装包上传到服务器上进行安装,不经常用,还是有点小麻烦的. 安装Python之后,将下载好的安装包包放在Python安装的根目录下使用 ...

  7. 2017-11-11 Sa Oct How to open a browser in Python

    2017-11-11 Sa Oct How to open a browser in Python python -m webbrowser "http://www.example.com/ ...

  8. 使用pip安装包提示TLS证书错误解决办法

    最近有在使用pip安装python包的时候,总会出现以下类似的错误: Could not fetch URL https://pypi.python.org/simple/pytest-xdist/: ...

  9. Django 日志输出及打印--logging

    Django使用python自带的logging作为日志打印工具. logging是线程安全的,主要分为4部分: Logger 用户使用的直接接口,将日志传递给Handler Handler 控制日志 ...

  10. centos中pipelinedb安装及初步使用

    安装 下载安装包 https://www.pipelinedb.com/download 创建系统文件目录和日志目录 pipelinedb安装 使用非root用户,初始化pipelinedb 修改配置 ...