前面一篇文章写到了实现单向链表,这篇文章记录一下实现双向链表。
双向链表顾名思义就是双向的链表,双向的意思是链表可以双向移动,即从前往后遍历和从后往前遍历均可实现。
双向链表的定义:双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。——来自百度百科
双向链表中每个节点分为三部分组成:第一部分是节点本身存储的数据,第二部部分是该节点的前一个节点的指针,第三部分是该节点下一个节点的指针。
双向链表的特点:
- 和单向链表一样没有容量限制
- 双向均可快速读写
至于线程安全的问题,由于是自定义实现,同步同步看个人喜好需要就行了。
双向链表的结构:
双向链表结构示意图
双向链表的操作:
1.插入新元素:将L1节点的Next指针指向新节点L4,将新节点L4的Pre指针指向L1,将新节点L4的Next指针指向L2,再将L2节点的Pre指针指向新节点L4。
双向链表插入新节点示意图
2.删除指定节点:将L1节点的Next指针指向L2节,将L3节点的Pre指针指向L2节点。
下面再看看代码的实现:
自定义双向链表:
package dataStructure;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.Objects;
import java.util.function.Consumer;
/**
* Created by Viking on 2019/4/9
* 实现双向链表
*
*/
public class MyBothLinkedList<E> implements Iterable<E>{
private transient int size;
private transient int modCount;
private transient Node<E> first;
private transient Node<E> last;
public void addFirst(E e){
linkFirst(e);
}
public void addLast(E e){
linkLast(e);
}
public void add(E e){
linkLast(e);
}
public void add(int index, E e){
linkIndex(index,e);
}
public E getFirst(){
return first.item;
}
public E getLast(){
return last.