一、双向循环链表
1.1 双向循环链表类
- 一个指向上一个节点的引用
- 一个指向下一个节点的引用
- 一个value区域
public class DoubleNode {
DoubleNode lastnode;
DoubleNode nextnode;
Object value;
}
1.2 添加节点
- 得到当前节点的下一个节点
- 将要添加的节点与下一个节点相连
- 将要添加的节点与上一个节点相连
//添加节点
public void addNode(DoubleNode node){
//下一个节点
DoubleNode nodeNext = this.next;
node.next = nodeNext;
nodeNext.last = node;
this.next = node;
node.last = this;
}
1.4 删除当前节点的下一个节点
public void delete(DoubleNode node){
DoubleNode nextNode = this.next.next;
this.next = nextNode;
nextNode.last = this;
}
1.5 删除当前节点
public void deleteNow(){
DoubleNode lastNode = this.last;
DoubleNode nextNode = this.next;
lastNode.next = nextNode;
nextNode.last = lastNode;
}
1.6 注意
双链表的last和next区域不能赋值为空,可能会产生Nullpointer异常,可以令next和last指向当前节点,而且会形成双向循环链表。
二、测试
源代码:
public class DoubleNode {
DoubleNode last = this;
DoubleNode next = this;
Object value;
public DoubleNode(Object value){
this.value = value;
}
//添加节点
public void addNode(DoubleNode node){
//下一个节点
DoubleNode nodeNext = this.next;
node.next = nodeNext;
nodeNext.last = node;
this.next = node;
node.last = this;
}
//删除当前节点的下一个节点
public void delete(DoubleNode node){
DoubleNode nextNode = this.next.next;
this.next = nextNode;
nextNode.last = this;
}
//删除当前节点
public void deleteNow(){
DoubleNode lastNode = this.last;
DoubleNode nextNode = this.next;
lastNode.next = nextNode;
nextNode.last = lastNode;
}
}
测试代码:
public class demo3 {
public static void main(String[] args) {
DoubleNode node = new DoubleNode(1);
DoubleNode node1 = new DoubleNode(2);
DoubleNode node2 = new DoubleNode(3);
DoubleNode node3 = new DoubleNode(4);
node.addNode(node1);
node1.addNode(node2);
node2.addNode(node3);
System.out.println(node1.next.value);
System.out.println(node1.last.value);
System.out.println("最后一个节点的下一个节点的值:");
System.out.println(node3.next.value);
node.delete(node1);
System.out.println("---------------------");
System.out.println(node.next.value);
System.out.println(node.last.value);
node.deleteNow();
System.out.println("---------------------");
System.out.println(node2.next.value);
System.out.println(node2.last.value);
}
}
结果:
3
1
最后一个节点的下一个节点的值:
1
---------------------
3
4
---------------------
4
4