概述

  LinkedList实质上就是双向链表的拓展的实现,我们将关注一下问题。LinkedList

  1、双向链表怎么来实现插入、删除、查询?

  2、利用二分法提高查询效率。

  3、不同步,线程不安全,需要使用Collections.synchronizedList()达到线程安全。

  4、简单说,LinkedList就是数据结构中关于数据操作吗?

模拟实现

1、实现总体图(初始状态)

2、论述双链表的实现思想

  双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。查询即从第一个节点,不断指向下一节点以便获得自己目标节点。删除、插入同理,最后修改目标节点的前后关系即可,就不多论述了。

3、采用二分法,向下遍历节点

  public Node node(int index){
Node temp=first;
    //采用二分法遍历节点
if(index<size<<1){
for(int i=0;i<index;i++){
temp=temp.getNext();
}
}else{
for(int i=size-1;i>index;i--){
temp=temp.getPrevious();
}
}
return temp;
}

4、查询

 public Object get(int index){
checkRange(index);
Node temp=null;
if(null!=first){
temp=node(index);
}
return temp.getObj();
}

5、插入一个元素(头部插入、尾部插入、中间插入)

public void add(int index,Object obj){
checkRange(index);
//移动指针,指向索引位置的节点
Node temp=node(index);
//从中间任任意一个位置插入
if(first!=null){
//创建一个新节点
Node n=new Node();
//修改当前节点的前后节点
Node before=temp.getPrevious();
n.setPrevious(before);
n.setNext(temp);
n.setObj(obj);
before.setNext(n);
temp.setPrevious(n);
}
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> add(Object obj){
Node n</span>=<span style="color: #0000ff;">new</span><span style="color: #000000;"> Node();
</span><span style="color: #008000;">//</span><span style="color: #008000;">如果队头为空从队头插入</span>
<span style="color: #0000ff;">if</span>(first==<span style="color: #0000ff;">null</span><span style="color: #000000;">){
</span><span style="color: #008000;">//</span><span style="color: #008000;">初始状态:头尾指针指向第一个节点</span>

n.setObj(obj);

n.setPrevious(null);

n.setNext(null);

first=n;

last=n;

}else{

//从队尾部插入

n.setObj(obj);

n.setPrevious(last);

n.setNext(null);

//上一个实现的next指向下一个节点

last.setNext(n);

last=n;

}

size++;

}

6、删除

 public void remove(int index){
checkRange(index);
if (null!=first){
//遍历直到目标节点
Node temp=node(index);
Node befor=temp.getPrevious();
Node after=temp.getNext();
after.setPrevious(befor);
befor.setNext(after);
size--;
}
}

7、源于揭秘LinkedList的核心部分,就没有赘述所有实现的方法。

JAVA容器-模拟LinkedList实现(双链表)的更多相关文章

  1. Python与数据结构[0] -> 链表/LinkedList[1] -> 双链表与循环双链表的 Python 实现

    双链表 / Doubly Linked List 目录 双链表 循环双链表 1 双链表 双链表和单链表的不同之处在于,双链表需要多增加一个域(C语言),即在Python中需要多增加一个属性,用于存储指 ...

  2. JAVA容器-模拟ArrayList的底层实现

    概述 ArrayList实质上就是可变数组的实现,着重理解:add.get.set.remove.iterator的实现,我们将关注一下问题. 1.创建ArrayList的时候,默认给数组的长度设置为 ...

  3. Java 中的 LinkedList 是单向链表还是双向链表?

    是双向链表,你可以检查 JDK 的源码.在 Eclipse,你可以使用快捷键 Ctrl + T, 直接在编辑器中打开该类.

  4. 图解双链表(Java实现)

    原创公众号:bigsai 文章已收录在 全网都在关注的数据结构与算法学习仓库 前言 前面有很详细的讲过线性表(顺序表和链表),当时讲的链表以但链表为主,但实际上在实际应用中双链表的应用多一些就比如Li ...

  5. 模拟LinkedList

    Linkedlist是一个集合容器,具有增删改查基本功能,本例中模拟增删查,对于修改,只需要将原节点处的val更新为新值即可,增加和删除在链表中速度是比较快的,查找,修改慢,因为要从头或者从尾开始遍历 ...

  6. java实现双链表(差点没写吐系列...)

    刚才把单链表写完了,现在又把双链表写了,双链表和单链表的区别就是每个节点有prior和next两个指针,不同于单链表的一个next指针,而且,正是因为有这两个指针,所以双链表可以前后两个方向去移动指针 ...

  7. 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现

    概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...

  8. Java 容器源码分析之 LinkedList

    概览 同 ArrayList 一样,LinkedList 也是对 List 接口的一种具体实现.不同的是,ArrayList 是基于数组来实现的,而 LinkedList 是基于双向链表实现的.Lin ...

  9. Java容器源码解析之——LinkedList

    我们直接从源码来分析LinkedList的结构: public class LinkedList<E> extends AbstractSequentialList<E> im ...

随机推荐

  1. 4B/5B编码原理

    4B/5B编码原理 什么是4B/5B编码? 4B/5B编码是百兆以太网(即快速以太网)中线路层编码类型之一,就是用5bit的二进制数来表示4bit二进制数,映射方式如下表所示: 为什么要进行4B/5B ...

  2. sed的额外用法(网摘)

    #在我开始动手写一个一个的脚本的时候才会看到更多的用法 1. 在某行的前一行或后一行添加内容(前提是要确定行的内容) # 匹配行前加 sed -i '/allow/ideny' httpd.conf ...

  3. CentOS7 安装python库(numpy、scipy、matplotlib、scikit-learn、tensorflow)

    0.1准备工作 安装好CentOS7,配置好网络,确保网络畅通. 0.2root授权 首先:当前用户为kaid # vim /etc/sudoers 在root ALL=(ALL) ALL之后添加: ...

  4. C/C++——[04] 语句

    在 C/C++语言中,语句以“ :”结束.某些情况下,一组语句在一起共同完成某一特定的功能,可以将它们用大括号括起来.我们称之为语句组.语句组可以出现在任何单个语句出现的地方. 1. 分支语句 一般情 ...

  5. Shp上传至Oracle Spatial

    1.下载shp2sdo,将shp文件拷贝至shp2sdo相同路径下,打开windows命令窗口,执行: shp2sdo shp文件名 表名 -i id -s 4326 -d 例如:shp2sdo ci ...

  6. <转>MYSQL数据库数据拆分之分库分表总结

    数据存储演进思路一:单库单表 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 数据存储演进思路二:单库多表 随着用户数量的 ...

  7. HDU 4725 The Shortest Path in Nya Graph(spfa+虚拟点建图)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4725 题目大意:有n层,n个点分布在这些层上,相邻层的点是可以联通的且距离为c,还有额外给出了m个条边 ...

  8. JavaWeb知识回顾-servlet简介。

    现在公司主要用jsp+servlet这种原生的开发方式,用的是uap的开发平台,所以趁着这个时候把有关javaweb的知识回顾一下. 首先是从servlet开始. 一.什么是Servlet?(是一些理 ...

  9. 关于Android不同系统版本的市场占比情况详解

    一,google官方统计的不同Android版本市场的占比强开 google统计的数据情况 这个是google官方对于不同版本的市场占比情况.这个是针对全世界所有的Android手机占比情况. 二,友 ...

  10. “裕同集团&易普优APS项目启动大会”顺利召开

    “裕同集团&易普优APS项目启动大会”顺利召开 ——易普优APS助力裕同集团实现精益生产 2017年7月05日,“裕同集团&易普优APS项目启动大会”顺利召开,裕同集团高级王副总裁.I ...