package Gather.CollectionArrayList.List.LinkedList;
/**
* @author 小王宝友
* @version 3.89
* LinkedList说明:
* LinkedList底层实现了双向链表和双端队列特点
* 可以添加任意元素(元素可以重复),包括null
* 线程不安全,没有实现同步和互斥
* LinkedList的底层说明:
* 1、LinkedList底层维护了一个双向链表
* 2、LinkedList中维护了两个属性:first和last分别指向"首节点"和"尾节点"
* 3、每个节点(Node对象),里面又维护了prev、next、item三个属性
* 其中prev指向前一个节点,通过next指向后一个节点,从而实现双向链表
* 4、LinkedList的元素的添加或是删除都不是通过数组完成的,相对来说效率较高
* 下面模拟一个简单的双向链表
*
*
*/
public class TestDoubly {
public static void main(String[] args) {
//双向链表
Node tom = new Node("Tom");
Node lsp = new Node("LSP");
Node jack = new Node("jack");
//连接三个节点,形成双向链表
//jack->tom->lsp
jack.next = tom;
tom.next = lsp;
//lsp->tom->jack
lsp.pre = tom;
tom.pre = jack;
Node first = jack;//让first引用指向jack,就是双向链表的头结点
Node last = lsp;//让last引用指向tom,就是双向链表的尾结点
//双向链表的遍历
System.out.println("=====头到尾=====");
while (true){
// 判断头指针是否为空
if (first == null){
break;
}
//输出first的信息
System.out.println(first);
//输出完第一个first信息后让first等于下一个对象信息
first = first.next;
}
System.out.println("=====尾到头=====");
while (true){
// 判断头指针是否为空
if (last == null){
break;
}
//输出last的信息
System.out.println(last);
//输出完第一个last信息后让last等于前一个对象信息
last = last.pre;
}
//双向链表添加对象/数据
System.out.println("===在jack和tom之间插入一个元素===");
//创建一个Node节点
Node rose = new Node("rose");
jack.next = rose;
rose.next = tom;
tom.pre = rose;
rose.pre = jack;
first = jack;//让first重新指向第一个节点
last = lsp;//让last重新指向最后一个节点
while (true){
// 判断头指针是否为空
if (first == null){
break;
}
//输出first的信息
System.out.println(first);
//输出完第一个first信息后让first等于下一个对象信息
first = first.next;
}
}
}
//定义一个Node类,Node对象表示双向链表的一个节点
class Node{
public Object item;//真正存放数据的地方
public Node next;//指向后一个节点
public Node pre;//指向前一个节点
public Node(Object name){
this.item = name;
}
@Override
public String toString() {
return "Node name = " + item;
}
}