数据结构 - 链表(双向链表)
上一篇博客中我提到了如何实习一个自定义的单向链表,其实单向链表在指定位置增删数据的速度还是有所限制,我们可以使用双向链表实现更快的增删操作
今天我们来实现一个双向链表
双向链表的实现原理与单向链表基本一致,每个节点的属性除了一个指向下一个节点之外多了一个指向上一个节点的属性
上图给出的是Java给我们提供的LinkedList类的结构图
注:本文中所写的双向链表并没有实现首位相连也就是循环链表
首先还是先定义一个节点类,比单向链表的属性多了一个指向上一节点的属性
public class Node {
private Object data;//节点的数据区
private Node next=null;//节点指向的下一个节点
private Node last=null;//节点的上一个节点
public Node(){
this.data=null;//创建空节点
}
//根据数据创建节点
public Node(Object data){
this.data=data;
}
}
也是两个构造方法,然后都设置这几个属性的set,get方法即可
然后我们定义一个DoubleLinked类,因为并未实现循环链表,所以除了头节点属性,size属性还需要尾节点属性
public class DoubleLinked {
private Node head;//声明双向链表的头节点
private Node last;//声明双向链表的尾节点
private int size;//链表中存储的节点数
}
同样的我们需要两个构造方法,带参数的就是在创建时就建立头节点
public DoubleLinked(){
this.head=null;
size=0;
}
public DoubleLinked(Object headData){
head=new Node(headData);
size=1;
}
访问链表的方法(以add方法举例):
add方法有两种实现的方法,一种是头插法,一种是尾插法。就是在添加数据时将新的数据放在链表的开始还是结束的位置
我在这里使用的是尾插法:
public void add(Object data){
Node node=new Node(data);//根据数据创建节点
if(size==0){
head=node;//设置当前节点为头节点
last=node;//设置当前节点为尾节点
size++;
}else{
last.setNext(node);//与尾节点建立关系
node.setLast(last);//将尾节点设置为当前节点的前一个节点
last=node;//设置当前节点为尾节点
size++;
}
}
这样一个简单的双向链表就完成了,不过还是建议写完去测试一下,防止出错。