我在阅读源码的过程中很多时候是没有头绪的。所以为了避免大家也遇到这种状况,源码不求全求大,做到“透过实践看源码”,分块分层。
LinkedList通常我们称之为链表集合。
首先在介绍LinkedList之前,对链表做一下说明:
大家对机械表的表链不知道还有没有印象,一节一节的?!
表带的最小单位就是”表节“,可拆卸,首位相连。
在java中可以模拟类似的节点。
//链表的底层节点类
private static class Node<E> {
//节点值
E item;
//节点的下一个关联节点
Node<E> next;
//节点的上一个关联节点
Node<E> prev;
//初始化
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
首先构建一个简单的单向链表:
public static void main(String[] args) {
Node<String> first=new Node<String>("第一个节点",null);
Node<String> nex=new Node<String>("第二个节点",null);
Node<String> nex_nex=new Node<String>("第三个节点",null);
first.next=nex;
nex.next=nex_nex;
nex_nex.next=first;
System.out.println(first.item);
System.out.println(first.next.item);
System.out.println(first.next.next.item);
System.out.println(first.next.next.next.item);
}
//链表的底层节点类,私有的内部类
private static class Node<E> {
//节点值
E item;
//节点的下一个关联节点
Node<E> next;
//初始化
Node(E element, Node<E> next) {
this.item = element;
this.next = next;
}
}
运行之后
输出结果:
第一个节点
第二个节点
第三个节点
第一个节点
其次构建一个简单的双向链表
public static void main(String[] args) {
Node<String> first=new Node<String>(null,"第一个节点",null);
Node<String> nex=new Node<String>(null,"第二个节点",null);
Node<String> pre=new Node<String>(null,"第零个节点",null);
first.next=nex;
first.prev=pre;
pre.next=first;
nex.prev=first;
pre.prev=nex;
nex.next=pre;
System.out.println(first.item);
System.out.println(first.next.item);
System.out.println(first.prev.item);
System.out.println(first.next.next.item);
}
//链表的底层节点类,私有的内部类
private static class Node<E> {
//节点值
E item;
//节点的下一个关联节点
Node<E> next;
//节点的上一个关联节点
Node<E> prev;
//初始化
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
运行输出结果:
第一个节点
第二个节点
第零个节点
第零个节点
双向链表可以前后访问,避免单向链表访问最后一个元素需要遍历整个链表的窘状