概述

  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. 多个id或class属性相同的元素绑定事件

    <td class="tools"><a href="javascript:void(0);" status="0" na ...

  2. 014 JVM面试题

    转自:http://www.importnew.com/31126.html 本文从 JVM 结构入手,介绍了 Java 内存管理.对象创建.常量池等基础知识,对面试中 JVM 相关的基础题目进行了讲 ...

  3. 设计模式之笔记--享元模式(Flyweight)

    享元模式(Flyweight) 定义 享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象. 类图 描述 Flyweight:抽象享元类,是所有的具体享元类的基类,为子类规定出需要实 ...

  4. php PDO判断连接是否可用的方法

    转载自:傲雪星枫  原文地址: http://blog.csdn.net/fdipzone/article/details/53117541 mysql_ping() 检查到服务器的连接是否正常.如果 ...

  5. [ python ] 字典的使用

    数据类型划分:    可变数据类型:list.dict.set    不可哈希    不可变数据类型:tuple.bool.int.str    可哈希 字典 python内置了字典类型,使用键-值( ...

  6. mysql一个字符问题

    顺便记录一下在使用mysql过程中碰到的一些问题: 有时候使用脚本迁移数据时会碰到乱码的问题,即使将表字符集设置成utf8也无济于事,这个时候在执行sql之前加一句set names utf8即可.

  7. 百度NLP面试题

    C++ :     1.拷贝构造函数和重载=符分别在什么情况下被调用,实现有什么区别 2.虚函数的目的,虚函数和模板类的区别,如何找到虚函数 常规算法: 1. 如何输出一个集合的所有真子集,递归和非递 ...

  8. 洛谷P1008三连击 题解

    题目传送门 使用dfs搜索,搜索9个数字,注意回溯...最后判断是否符合条件,输出. #include<bits/stdc++.h> using namespace std; ],a[]; ...

  9. 邂逅Sass和Compass之Compass篇

    本文主要讲解Compass的内容,众所周知Compass是Sass的工具库,如果对Sass不甚了解的同学可以移步 邂逅Sass和Compass之Sass篇 Sass本身只是一个“CSS预处理器”,Co ...

  10. [笔记]用gdb调试core dump

    总是隔一段时间才写一次C++,有些东西老是用完就忘了……记一下如何用gdb来调试core dump免得到时候又忘记. 首先需要设置core file的大小,默认是0所以不设不会生成core file ...