本章内容
LinkedList特点
LinkedList底层实现
LinkedList实现方法
LinkedList特点
-
查询效率低
-
增删效率高
-
线程不安全
LinkedList底层实现
双向链表实现的存储
特点:
-
双链表,是链表的一种
-
每个数据节点中都有两个指针,分别指向前一个节点和后一个节点
优势:
-
从任意节点开始都可以很方便地找到所有节点
解析:
-
在使用链表地时候,每一个头部和尾部称为节点
-
单词表示:Node或者Entry
-
-
每一个节点包含三个部分:
-
第一个节点头部有一个头指针
-
上一个节点地---指向上一个数据
-
自己保存的数据
-
下一个节点---指向下一个数据
-
-
LinkList地结构让增、删变得很简单
-
先说删
-
删掉a2
-
让a1的尾节点指向a3这个数据本身
-
让a3的头节点指向a1这个数据本身
-
这样就实现了删
-
-
增加a2
-
让a1的尾节点指向a2的数据本身
-
让a3的头节点指向a2的数据本身
-
-
-
如图:
自定义列表还需要定义节点对象:
定义节点对象
每一个节点对象所包含的内容:
class Node{
Node previous; //前一个节点
Object element; //本节点保存的数据
Node next; //后一个节点
}
具体实现:
package com.MyCollection;
/**
* 自定义一个链表---version 1.0
* @author Lucifer
*/
public class LcfLinkedList {
/*自定义列表定义第一个节点*/
private Node first; //开始为null
/*定义最后一个节点*/
private Node last; //开始为null
/*定义元素总数量*/
private int size;
/*往链表加东西,定义一个add方法*/
//"[]"--->"["a"]"
public void add(Object obj){
/*因为一开始节点为空,没有数据内容,所以往里面加内容---创建一个节点*/
Node node = new Node(obj);
/*
这样就创建好了一个节点
目前和链表没啥关系
*/
/*判断是否是第一次往链表里面放元素*/
if (first == null){
/*赋值node给first*/
first = node;
/*赋值给last*/
last = node;
//注意Node类中的元素一开始是否为空
/*
下面继续往里面放元素
"["a","b"]"
第二次放入的时候first不为空了
再建一个新对象,放入新节点
*/
}else {
/*将上一个节点的尾节点赋值给下一个节点的头节点*/
node.previous = last;
/*第二个元素的尾节点为空*/
node.next = null;
/*让last的下一个属性指向*/
last.next = node;
/*last本身指向node*/
last = node;
}
}
/*希望输出的结果可视化,重写toString方法*/
//从first开始打印,然后依次往下找
//假设有一个链表["a","b","c"]--->first = a, lsat = c--->最终打印要打印出a,b,c