双向循环链表介绍
双向循环链表和单向循环链表最大的区别就是可以通过当前结点找到下一个结点和上一个结点,比如说对链表进行删除操作,单向链表通过当前节点是找不到上一个节点的,因此不能删除传入的节点,只能删除传入的节点的下一个结点。单向链表如果真想删除传入的节点,可以让下一个结点的值等于传入的结点,让传入结点的下一个结点等于下下一个结点。代码实现
//单向链表删除传入结点
public void remove(Node node){
//拿到传入结点的下一个结点的值
int value = node.next.value;
//让传入结点的值等于刚拿到的下一个结点的值
node.value = value;
//让传入结点的下一个结点等于下下个结点
node.next = node.next.next;
}
//如果是双向链表,移除传入结点
public void remove(Node node){
//找到传入结点的下一个结点
Node next = node.next;
//传入结点的上一个结点的下一个结点等于传入结点的下一个结点
node.pre.next = node.next;
}
代码实现双向循环链表:
public class DoubleNode {
private DoubleNode pre = this;
private DoubleNode next = this;
private int data;
public DoubleNode(int data){
this.data = data;
}
//添加节点
//只需要让当前结点和新节点产生关系,点前结点的下一个结点和新节点产生关系即可。
public void after(DoubleNode node){
//先找到当前节点的下一个节点
DoubleNode next = this.next;
//当前节点的下一个节点是新节点
this.next = node;
//新节点的上一个节点是当前节点
node.pre = this;
//新节点的下一个结点是当前结点的下一个结点
node.next = next;
//当前结点的下一个节点的上一个结点是新节点
next.pre = node;
}
//获取下一个结点
public DoubleNode getNext(){
return this.next;
}
//获取上一个结点
public DoubleNode getPre(){
return this.pre;
}
}
双向链表图形结构: