package javal.util.test;
/**
* 双端链表
* @author lh
*/
public class FirstLastLink {
private Link first;//第一个节点的引用
private Link last; //最后一个节点的引用
public FirstLastLink() {
first = null;
last = null;
}
public boolean isEmpty() {
return first == null;
}
public void addfirst(long data) {
Link link = new Link(data);
if(isEmpty()) { //如果为空 则 link就是第一个节点也是最后一个节点
last = link;
}
link.next=first;
first=link;
}
/*
* 皮
*/
public void addlast(long data) {
Link link = new Link(data);
if(isEmpty()) {
first = link;
}else {
last.next=link;//先改变未插入数据前最后一个数据的下个数据的引用,就是link
}
last=link;//把last指向新增的数据
}
public long getfirst() {
long temp = first.data;
if(first.next==null) {
last =null;
}
first=first.next;
return temp;
}
public void display() {
Link current =first;
while(current !=null) {
current.show();
current=current.next;
}
}
public static void main(String[] args) {
FirstLastLink link =new FirstLastLink();
link.addfirst(22);
link.addfirst(33);
link.addfirst(66);
link.addlast(77);
link.addlast(88);
link.addlast(99);
link.display();
}
}
双端链表和单链表基本上是一样的,只不过多了一个指向最后一个节点的引用,这样就可在链表尾端插入数据啦,如果只使用addLast,这不就是队列了吗?。除了数组之外,现在又多了一种队列实现方式。
关于链表的效率: 在头部插入和删除数据很快,因为只需要改变一两个引用值就可以了,所以时间复杂度为O(1),
查找和删除以及在指定链结点插入数据 ,平均起来都需要访问链表中一半的数据,需要进行O(N)次比较,但是不需要移动任何数据,和数组相比,要快很一些。
初次之外,链表需要多少内存就可以用多少内存,不会造成资源浪费,其不像数组一样初始化完之后大小就固定了,链表可以扩展。(此处不考虑java中的向量,向量的长都扩展其实是数组拷贝,其每一次增容,幅度大小是固定的,这种可扩展个人感觉并不是很好)。