概述

  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. [Leetcode] Search in Rotated Sorted Array 系列

    Search in Rotated Sorted Array 系列题解 题目来源: Search in Rotated Sorted Array Search in Rotated Sorted Ar ...

  2. 64_p2

    perl-Class-XSAccessor-1.19-10.fc26.x86_64.rpm 12-Feb-2017 15:12 48098 perl-Clipboard-0.13-16.fc26.no ...

  3. React 16 源码瞎几把解读 【三 点 二】 react中的fiberRoot

    〇.先来看看常用的常量 NoWork = 0 noTimeout = undefined HostRoot = 3 NoContext = 0b000; AsyncMode = 0b001; Stri ...

  4. https、socket、http协议

    一.https https 其实是由两部分组成:http+ssl(Secure Sockets Layer 安全套接层)/tls(Transport Layer Security 继任者安全传输层), ...

  5. [ python ] 变量及基础的数据类型

    python2 和 python3 不同的编码方式 python2 默认编码方式是 ascii码 python3 默认编码方式是 utf-8 具体表现为:当 python3 和 python2 在打印 ...

  6. SVN的使用、分支合并及解决冲突详解

    一.什么是SVN SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. 二.SVN的下载安装 下载地址:http ...

  7. 防范XSS跨站2

    原文:http://blog.csdn.net/joeyon1985/article/details/43527987 在前面的一篇文章中,讲到了java web应用程序防止 csrf 攻击的方法,参 ...

  8. mknod命令

    mknod - make block or character special filesmknod [OPTION]... NAME TYPE [MAJOR MINOR]    option 有用的 ...

  9. python 爬图

    利用bs库进行爬取,在下载html时,使用代理user_agent来下载,并且下载次数是2次,当第一次下载失败后,并且http状态码是500-600之间,然后会重新下载一次 soup = Beauti ...

  10. hdu 5918(强行水过去..正解KMP)

    Sequence I Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...