对双向链表的浅理解随记
java源码:
//内部类,把双向链表中的元素定义为:prev、elemen、next三个部分
private static class Node> {
E item;
Node> next;
Node> prev;
Node(Node prev, E element, Node> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
//LinkedList中创建双向链表的方法
void linkLast(E e) {
final Node> l = last;
final Node> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
调LinkedList.add(),传入“a”、“b”、“c”
List list=new java.util.LinkedList();
list.add("a");
list.add("b");
list.add("c");
执行过程及分析
1、传入“a"时,第一个元素传入时,fast、last为null
void linkLast(E e) {
//l=last=null
final Node l = last;
//newNode为(null,"a",null),假设地址为ox213
final Node newNode = new Node<>(l, e, null);
//last指向newNode,last存放ox123
last = newNode;
//此时l=null,first指向newNode,存放内存地址ox123
if (l == null)
first = newNode;
else
l.next = newNode;
//元素个数为1
size++;
modCount++;
}
2、传入“b"时,fast、last均存放前一个元素的内存地址ox123
void linkLast(E e) {
//l=last=ox123
final Node l = last;
//newNode为(ox123,"b",null),假设地址为ox456
final Node newNode = new Node<>(l, e, null);
//last指向newNode,last存放ox456
last = newNode;
//此时l=ox123,l.next(即第一个元素的next部分)指向new Node,
//存放内存地址ox456
if (l == null)
first = newNode;
else
l.next = newNode;
//元素个数为1
size++;
modCount++;
}
此时双向链表中的元素为
(null,"a",ox456)
(ox123,"b",null)
第一个元素的next部分指向第二个元素,存放第二个元素的内存地址
第二个元素的prev部分指向第一个元素,存放第一个元素的内存地址
存入第三个元素也是同理,利用l、first、last三个局部变量对内存地址进行替换
赋值给每个元素的prev、next部分