LinkedList : 双向链表与实现
所谓双向链表:

(由此图可见老夫深厚的画功)
链表,就是由一个一个的节点连接组成。
在这里,每一个节点都是由三部分组成:上一个节点、当前节点的元素、下一个节点

当链表中只有一个节点的时候,这个节点指向的上一个节点是空的,下一个节点也是空的

当有多个节点的时候,第一个节点的上一个节点是空的,最后一个节点的下一个节点也是空的。
如上图:A节点的下一个节点指向了B节点,B节点的上一个节点指向了A节点
不说了...鉴于本人表达能力有限...直接上代码吧...
public class MyLinkedList {
/*第一个节点*/
private Node first;
/*最后一个节点*/
private Node last;
/*大小*/
private int size;
/**
* 获取这个链表的大小(元素的个数)
* @return
*/
public int size(){
return size;
}
/**
* 这个方法是从LinkedList.node(index)方法中复制过来的,稍加修改
* 用于返回指点下标处的节点
* @return
*/
private Node node(int index){
/*
* 打个比方:
* size = 6;
* size >> 1 = 3
* 如果index小于3的话,就从第一个找到最后一个
* 如果index大于3的话,就从最后一个找到第一个
* 下面代码亦是如此
*/
if (index < (size >> 1)) {
Node x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
/**
* 增加一个节点
* @param obj 要增加的元素
*/
public void add(Object obj){
Node temp = new Node();//新的节点
/*新节点的元素赋值*/
temp.element = obj;
if (first==null) {//如果第一个节点是空的,那就是没有节点
//这个节点既然是第一个节点,所以节点的prev点和next都是空的,所以,不用赋值
//同理,这个新插入的节点是第一个,也是最后一个
first = temp;
last = temp;
}else {//否则,那就意味着这个节点不是空的。
//新节点的prev就是在这个节点插入前的最后一个节点
temp.prev = last;
//而插入前的最后一个节点的next就是这个新的节点了
//这样,就会形成一条链:a的下一个是b,b的上一个是a,a的下一个是b......
last.next = temp;
//最后,新的节点就是最后一个节点了
last = temp;
}
//插入成功size++;
size++;
}
/**
* 增加一个节点,指定位置
* @param index
* @param obj
*/
public void add(int index, Object obj){
Node temp = node(index);//得到的节点
Node newNode = new Node();//新的节点
newNode.element = obj;
if (temp!=null) {//如果得到的指定节点不是空的话
//得到temp的上一个节点
Node tempPrev = temp.prev;
//tempPrev的下一个节点赋值为newNode
tempPrev.next = newNode;
//同时,newNode的上一个节点赋值为tempPrev
newNode.prev = tempPrev;
//然后newNode的下一个节点便是这个一开始就指定的temp节点
newNode.next = temp;
//temp的上一个节点赋值为newNode
//这样在指定元素之前插入了一个新的元素
temp.prev = newNode;
}
size++;
}
/**
* 删除
* @param index
*/
public void remove(int index){
/*
* 删除...
* 有 a b c三个元素
* a的下一个节点是b b的下一个节点是c
* c的上一个节点是b b的上一个节点是a
* --
* 比如删除了b
* 那就要把a 和 c 连接起来。
*
* 连接好了后,就是:
* a 下一个节点是 c
* c 上一个节点是 a
*
*/
Node temp = node(index);//得到指定下标的元素
if (temp!=null) {
/*
//得到temp的上一个节点
Node tempPrev = temp.prev;
//得到temp的下一个节点
Node tempNext = temp.next;
//tempPrev的下一个节点是tempNext
tempPrev.next = tempNext;
//而tempNext的上一个节点就是tempPrev
tempNext.prev = tempPrev;
*/
//temp的上一个节点的下一个节点就是temp的下一个节点
temp.prev.next = temp.next;
//temp的下一个节点的上一个节点就是temp的上一个节点
temp.next.prev = temp.prev;
}
size--;
}
/**
* 根据下标获取元素
* @param index 元素的索引
* @return
*/
public Object get(int index){
return node(index).element;//得到指定节点的元素
}
/*------------------------------------------------------------*/
public static void main(String[] args) {
MyLinkedList list = new MyLinkedList();
list.add("a");
list.add("b");
list.add(1,"B");
list.remove(1);
System.out.println(list.get(1));
System.out.println("当前链表的大小:"+list.size());
}
}
/**
* 节点类
*/
class Node{
/*
* 表示上一个节点
* 所以使用节点类型
*/
Node prev;
/*表示下一个节点*/
Node next;
/*当前节点的元素*/
Object element;
public Node() {
}
public Node(Node prev, Node next, Object element) {
this.prev = prev;
this.next = next;
this.element = element;
}
}
LinkedList : 双向链表与实现的更多相关文章
- JDK1.8 LinkedList双向链表源码
序言 LinkedList是一个双向链表 也就是说list中的每个元素,在存储自身值之外,还 额外存储了其前一个和后一个元素的地址,所以也就可以很方便地根据当前元素获取到其前后的元素 链表的尾部元素的 ...
- JAVA数据结构--LinkedList双向链表
链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个部分: ...
- Java 集合深入理解(11):LinkedList
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天心情鱼肚白,来学学 LinkedList 吧! 日常开发中,保存一组数据使用的最多的就是 ArrayList, 其次就 ...
- LinkedList的自定义实现
一.背景 LinkedList双向链表: 代码: Node.java: package com.cy.collection; public class Node { Node previous; // ...
- 深入理解java集合框架之---------LinkedList
日常开发中,保存一组数据使用的最多的就是 ArrayList, 其次就是 LinkedList 了. 我们知道 ArrayList 是以数组实现的,遍历时很快,但是插入.删除时都需要移动后面的元素,效 ...
- LinkedList 基本示例及源码解析
目录 一.JavaDoc 简介 二.LinkedList 继承接口和实现类介绍 三.LinkedList 基本方法介绍 四.LinkedList 基本方法使用 五.LinkedList 内部结构以及基 ...
- Java集合 LinkedList的原理及使用
Java集合 LinkedList的原理及使用 LinkedList和ArrayList一样是集合List的实现类,虽然较之ArrayList,其使用场景并不多,但同样有用到的时候,那么接下来,我们来 ...
- List集合总结,对比分析ArrayList,Vector,LinkedList
前面已经写了三篇关于Java集合的文章,包括: Java集合 ArrayList原理及使用 再说Java集合,subList之于ArrayList Java集合 LinkedList的原理及使用 关于 ...
- 源码分析(5)-ArrayList、Vector和LinkedList(JDK1.8)
一.概述 1.线程安全:ArrayList和LinkedList非线程安全的.Vector线程安全的. 2.底层数据结构:ArrayList和Vector底层数据结构是数组:LinkedList双向链 ...
随机推荐
- a标签的onclick和href事件的区别
在执行顺序上href是低于onclick的,那么这个会造成什么影响呢 <div onclick="a()"> <a href="#" oncl ...
- IActiveView 接口 - 浅谈
IActiveView 和 IMap以其 Map, PageLayout之间的关系. 在ArcMap中, PageLayout 和 Map分别对应不同的视图: layout 和data view.在同 ...
- (原)python使用ctypes调用C/C++接口
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6135514.html 参考网址: https://docs.python.org/2/library/ ...
- JSONP的原理
JSONP的原理 JSONP的最基本的原理是:动态添加一个<script>标签,而script标签的src属性是没有跨域的限制的. <script type="text/j ...
- 如何在Protel99se中批量修改元件的封装
有时候需要批量修改元件的封装,可在原理图和PCB中批量修改.本文以批量修改电阻AXIAL0.3 的封装为AXIAL0.4 为例. 1. 在原理图中批量修改1.1. 方法1双击需要修改封装的其中一个元件 ...
- BZOJ1132: [POI2008]Tro
1132: [POI2008]Tro Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 815 Solved: 211[Submit][Status] ...
- bzoj4003
http://www.lydsy.com/JudgeOnline/problem.php?id=4003 可合并堆. 每个点都有一个小根堆,记住可以到这个点的骑士有哪些,以战斗力为关键字. 从底层到顶 ...
- 关于overload和override
override 覆盖,表示在子类中一个函数覆盖基类中的同名函数,或者局部的某个函数覆盖了全局的某个同名函数.被覆盖的函数通常不能直接被调用,必须借助一些显式的强制手段. overload 重载,表示 ...
- Codeforces Round #327 (Div. 1) D. Top Secret Task
D. Top Secret Task time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- Android 通过外键连接两个数据库
Learn: 1.Android数据库的语法. 2.通过外键连接两个数据库. 3.加强了对数据库的熟悉度. 4.对文本框的visiblity属性的了解. Demo:http://pan.baidu.c ...