JAVA容器-模拟LinkedList实现(双链表)
概述
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实现(双链表)的更多相关文章
- Python与数据结构[0] -> 链表/LinkedList[1] -> 双链表与循环双链表的 Python 实现
双链表 / Doubly Linked List 目录 双链表 循环双链表 1 双链表 双链表和单链表的不同之处在于,双链表需要多增加一个域(C语言),即在Python中需要多增加一个属性,用于存储指 ...
- JAVA容器-模拟ArrayList的底层实现
概述 ArrayList实质上就是可变数组的实现,着重理解:add.get.set.remove.iterator的实现,我们将关注一下问题. 1.创建ArrayList的时候,默认给数组的长度设置为 ...
- Java 中的 LinkedList 是单向链表还是双向链表?
是双向链表,你可以检查 JDK 的源码.在 Eclipse,你可以使用快捷键 Ctrl + T, 直接在编辑器中打开该类.
- 图解双链表(Java实现)
原创公众号:bigsai 文章已收录在 全网都在关注的数据结构与算法学习仓库 前言 前面有很详细的讲过线性表(顺序表和链表),当时讲的链表以但链表为主,但实际上在实际应用中双链表的应用多一些就比如Li ...
- 模拟LinkedList
Linkedlist是一个集合容器,具有增删改查基本功能,本例中模拟增删查,对于修改,只需要将原节点处的val更新为新值即可,增加和删除在链表中速度是比较快的,查找,修改慢,因为要从头或者从尾开始遍历 ...
- java实现双链表(差点没写吐系列...)
刚才把单链表写完了,现在又把双链表写了,双链表和单链表的区别就是每个节点有prior和next两个指针,不同于单链表的一个next指针,而且,正是因为有这两个指针,所以双链表可以前后两个方向去移动指针 ...
- 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现
概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...
- Java 容器源码分析之 LinkedList
概览 同 ArrayList 一样,LinkedList 也是对 List 接口的一种具体实现.不同的是,ArrayList 是基于数组来实现的,而 LinkedList 是基于双向链表实现的.Lin ...
- Java容器源码解析之——LinkedList
我们直接从源码来分析LinkedList的结构: public class LinkedList<E> extends AbstractSequentialList<E> im ...
随机推荐
- C++之模板编程
当我们越来越多的使用C++的特性, 将越来越多的问题和事物抽象成对象时, 我们不难发现:很多对象都具有共性. 比如 数值可以增加.减少:字符串也可以增加减少. 它们的动作是相似的, 只是对象的类型不同 ...
- 打开exls表格时报‘向程序发送命令是出现问题’的错误的解决方法
1.问题现象 打开表格文件时系统报如下错误 2.解决方法 1)按照如下方法找到excel选项,点击进入 2)找到‘忽略使用动态数据交换(DDE)的其它应用程序(O)',去掉复选框种的勾,点击确定,重新 ...
- 非交互式shell脚本案例-实现自主从oracle数据库获取相关数据,并在制定目录生成相应规则的文件脚本
get_task_id 脚本内容 #!/usr/bin/expect#配置登陆数据库的端口set port 22#配置登陆数据库的ip地址set oracleip 10.0.4.41#配置数据库实例名 ...
- 转:google测试分享-测试经理
原文: http://blog.sina.com.cn/s/blog_6cf812be0102vode.html 前言:这个系列分享的内容大部分都是出自于<google是如何测试的>的书, ...
- 20165301 2017-2018-2 《Java程序设计》第八周学习总结
20165301 2017-2018-2 <Java程序设计>第八周学习总结 教材学习内容总结 第十二章:Java多线程机制 进程与线程 操作系统与进程:进程是程序的一次动态执行过程. 进 ...
- CEPH 使用SSD日志盘+SATA数据盘, 随OSD数目递增对性能影响的递增测试
最近建设新机房,趁项目时间空余较多,正好系统的测试一下CEPH集群性能随OSD数目的变化情况, 新ceph集群测试结果如下: 1)4k随机读在3/6/9osd host下的性能差不多,吞吐量约50~6 ...
- MYSQL-----流程控制 if() 函数的用法
语法:IF(condition,result,result) 如果函数的第一个参数中给定的condition符合条件(如,condition不等于0或者不为NULL),那么函数的执行结果为第二个参数中 ...
- MINIBASE源代码阅读笔记之buffer manager
BufDesc frame 们的 descriptor(见BufHashTbl注释),包括 pageNo: 这个 frame 在文件里的id,page number prevframe: -1 表示此 ...
- JavaScript(获取或设置html元素的宽,高,坐标),确定和判断鼠标是否在元素内部,二级导航菜单鼠标离开样式问题解决
设置: document.getElementById('id').style.width=value document.getElementById('id').style.height=va ...
- 原生js将数组分割成固定个数一组的小数组
reSetData(dataList,num) { let arr = []; let len = dataList.length; for (let i = 0; i < len; i += ...