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双向链 ...
随机推荐
- c - 逆序/正序输出每位.
#include <stdio.h> #include <math.h> /* 判断一个正整数的位数,并按正序,逆序输出他们的位. */ int invert(int); vo ...
- C#Graphics画图
public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { G ...
- Python新手学习基础之循环结构——For语句
for语句 在Python里,循环语句除了while语句,还有for语句. 通常我们用for循环来遍历(按约定的顺序,对每个点进行访问,且只做一次访问)有序列的内容,比如列表和字符串(列表内容我们会在 ...
- Tr A(HDU 1575 快速矩阵幂模板)
Tr A Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- pfsense下的流量管理(转)
http://www.pppei.net/blog/post/331 在作流量管理时,这些概念很重要,不要迷失.. 这里再对Limiter 的源地址和目的地址做个说明,因为limiter是被应用在La ...
- XJOI网上同步训练DAY5 T1
思路:考虑得出,最终的集合一定是gcd=1的集合,那么我们枚举n个数中哪个数必须选,然后把它质因数分解,由于质数不会超过9个,可以状态压缩,去得出状态为0的dp值就是答案. #include<c ...
- logstash 发送zabbix告警
<pre name="code" class="html">[elk@dr-mysql01 test]$ cat t1.conf input { s ...
- java开发经验分享(四)
四. 关于测试 1. 在整个项目计划中,测试时间安排的合理性,对测试阶段的情况应作充分预计,不可为了赶发布点而忽略质量. 2. 务必清楚产品包.更新包.bug包的提交规范.具体请参照<开发规范手 ...
- 黑马程序员_Java_String
String类 一.概述 字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String s1 = "abc";//s1是一个类类型变量,"abc"是 ...
- linux下,FTP服务相关
虚拟机上安装完CentOS 6.5后,使用FTP工具(FlashFXP)来上传文件到虚拟机的linux,结果发现连接不上.现在解决了,解决方法总结一下: 1.先检查有没有安装ftp.好像包括两个部分, ...