为了更好地理解双向链表,先说几个相关的概念
List:特性:必须按照插入的顺序来保存元素
第一种实现:最常用的arrylist:结构类似于数组,所以访问元素的时候可以直接通过索引来访问任何位置的数据,但是当插入元素的时候默认是追加到数组的最后,那么数组当中原有的元素的位置不变 只是申请开辟了一块内存空间和新增加了一个索引,其他都没有变化,但是当向其他位置插入元素的时候,会先申请开辟一块内存空间和一个新索引 但是这个索引不是给新插入元素使用的,而是给数组当中最后一个元素使用的,新元素会插入到指定索引位置 代替原索引处的元素 并将该元素以及其后面的所有元素全部向后移动,所以这个是浪费时间的,而删除呢就是一样的原理,队尾删除很简单,其他位置删除。位于被删除元素后面的元素的位置全部向前移动。所以一样很浪费时间。所以该实现只是适用于随机访问元素或者遍历元素,因为他的底层是由数组来实现的。
第二种常用的实现是:linkedlist,它是基于链表实现的,链表有很多种
链表是一系列的节点组成的,这些点不需要在内存中相连
单链表是由一个头结点开始。然后依次插入新的节点。每个节点包含两个部分一个是数据的引用或者基本类型的数据 和下一个节点的存储地址。这样一个链表向外暴露的只是第一个头结点。所以只要知道头结点就可以直接找到剩下其余的节点。
单链表的内存结构如下图:
头结点不存储数据 其他节点存储的结构看下图 是数据加上下一个节点的地址
双向链表:双向链表的每一个结点都有一条指向其后继结点的next链和一条指向其前结点的pre链。双向链表既可以从第一项开始遍历也可以从最后一项开始往前遍历,双向链表可以用下图表示:
java的linkedlist实现了双向链表 看下linkedlist的用法
import java.util.ArrayList;
import java.util.LinkedList;
import org.junit.Before;
public class Test {
public static LinkedList<String> dl;
public static ArrayList<String> l;
@Before
public void init() {
dl = new LinkedList<String>();
dl.add("N1");
dl.add("N2");
dl.add("N3");
dl.add("N4");
dl.add("N5");
l = new ArrayList<String>();
l.add("N1");
l.add("N2");
l.add("N3");
l.add("N4");
l.add("N5");
}
@org.junit.