相比于数组,链表的查询效率较低,但是增删效率较高,双向链表具有头尾两个节点,每个节点均有三部分组成,前驱指针用来指向前一个节点,后驱指针用来指向后一个节点,另一部分则用来存在数据。与数组一样,访问链表依靠的是下标,根据下标来定位到我们所要访问的节点,向链表中添加一个节点时,要先判断这个链表的头节点是否为空,如果链表的头结点为空,那么我们当前新添加进去的节点则成为头结点,也成为尾节点,有了尾结点之后,后续我们添加节点,直接往为节点的后面添加即可。同样,删除节点的原理也不难。
package homework;
//双向鏈錶的實現
public class DoubleLinkNode {
private DoubleNode first; //雙向鏈錶頭結點
private DoubleNode last; //最後一個節點
private int size; //鏈錶大小
public DoubleLinkNode() {
super();
}
public void add(Object object){ //添加节点进双向链表中
DoubleNode dNode=new DoubleNode(); //构建一个节点
if (first==null) { //判断头结点是否为空,如果头结点为空,则将添加进来的节点作为头结点
first=dNode;
dNode.setData(object);
first.setPrevious(null);
first.setNext(null);
last=dNode;
}else { //如果头结点不为空,则将新构建出来的节点添加到最后一个节点后面
dNode.setData(object);
last.setNext(dNode);
dNode.setPrevious(last);
last=dNode;
}
size++;
}
public Object get(int index){ //根據下標獲取元素
try {
rankchek(index); //檢查下標是否越界
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
DoubleNode temp=locateNode(index); //定位到節點
return temp.getData();
}
public void remove(int index){ //刪除節點
try {
rankchek(index); //檢查下標是否合法
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
DoubleNode temp = locateNode(index); //定位到節點
DoubleNode before = temp.getPrevious(); //獲取當前节点的前一個节点
DoubleNode after = temp.getNext(); //获取当前节点的后一个节点
before.setNext(after);
after.setPrevious(before);
size--;
}
public void add(int index,Object object){ //往具体的下标添加节点
try {
rankchek(index); //检查是否越界
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
DoubleNode temp=locateNode(index); //定位到当前下标节点
DoubleNode doubleNode=new DoubleNode(); //新构建一个节点
doubleNode.setData(object);
DoubleNode front=temp.getPrevious(); //获取当前节点的前一个节点
front.setNext(doubleNode); //前一个节点指向新构建节点
doubleNode.setPrevious(front);
doubleNode.setNext(temp); //新构建节点指向后一个节点
temp.setPrevious(doubleNode);
size++;
}
public DoubleNode locateNode(int index){ //节点定位函数,便于我们定位到所需节点
DoubleNode temp=null;
if (first==null) {
}else {
temp=new DoubleNode();
temp=first;
for (int i = 0; i < index; i++) { //根据索引来获取当前元素
temp=temp.getNext();
}
}
return temp;
}
public void printnode(){ //节点打印函数
DoubleNode temp=first;
for (int i = 0; i <=size-1; i++) {
System.out.println(temp.getData());
temp=temp.getNext();
}
}
public int size(){ //获取双向链表大小函数
return size;
}
public void rankchek(int index) throws Exception{ //越界检查函数
if (index<0||index>=size) {
throw new Exception();
}
}
}