java双向链表结构在jdk1.2中就已有用到,在java的线程池队列中也均有用到。
所谓的双向链表结构如其名字,它有俩个端口,一个头部,一个尾部,支持向前遍历,或者向后遍历。
代码实现:
dData : 当前数据
next : 下一个指针
previous : 上一个指针
public class Link {
public long dData;
public Link next;
public Link previous;
public Link(long d){
this.dData=d;
}
public void displayLink(){
System.out.println(dData+" ");
}
}
定义一个队列 DoublyLinkList ,双向链表结构。
每次创建一个队列,把first置空。
public class DoublyLinkList {
private Link first;
public DoublyLinkList(){
this.first=null;
}
public boolean isEmpty(){
return (this.first==null);
}
}
向头部添加元素方法:
这里就会体现出双向链表数据结构的不同,为什么呢,比如我们现在的队列是 2 3 4 那么我们现在向队列头部添加一个元素1,就变成了 1 2 3 4,之前第一位的next指针是值3 ,现在是指2了。
public void insertFirst(long dd)
{
//从头部添加元素
Link newLink = new Link(dd); //新建节点
if(!isEmpty()) //不为空进入
//把当前的link的前指针设置为新的link
this.first.previous = newLink; //第一步
//把新的link的后指针设置为当前的link
newLink.next = this.first; //第二步
this.first = newLink; //第三步
}
删除头节点:
第一步先取到删除的元素,做方法返回。
第二步,我们取到当前需要删除元素的下一个元素的上一个元素,然后置空。
第三步,当前元素等于下一个元素。
public Link deleteFirst()
{
Link temp = this.first; //返回删除的节点
this.first.next.previous = null; //第一步
this.first = this.first.next; //第二步
return temp;
}
删除指定元素:
这里可能就比删除头节点复杂一点,
首先我们遍历找到需要删除的元素,从第一个元素开始,在我们找到元素之后,如果是头节点则执行头节点的删除方法,如果不是我们首先把当前元素的上一个元素的下指针改成当前元素的下一个元素,把当前元素的下一个元素的上指针改成当前元素的上指针。如果是最后一个元素则不执行这一步。
通俗点理解,比如我们当前需要删除的是 A B C D E 中的C元素,C元素的上指针是B,下指针是D,B元素的上指针是A,下指针是C,D上指针是C,下指针是E,我们删除C会影响B和D中的指针,所以我们删除C,把B的下指针改成D(即是C的下指针),把D的上指针改成B(即是C的上指针),这样就完成了删除操作。
public Link deleteKey(long key)
{
//遍历链表查找节点
Link current = this.first;
while(current.dData!=key)
{
current = current.next;
if(current==null)
return null;
}
//如果是头节点,则按照删除头节点的方式删除节点
if(current==this.first)
this.first = this.first.next;
//否则
else
{
current.previous.next = current.next; //第一步
if(current.next!=null)
current.next.previous = current.previous; //第二步
}
return current;
}
添加指定节点元素思路也是和删除指定元素类似,主要在于前后指针的操作,这里注意,队列它其实和我们现实中的不一样,现实中我们队列应该是整整齐齐的一列,但是这里不一样,这里能成一个队列,就是你前后元素的前后指针对应即组成一个队列。