我们知道单向链表只能从一个方向遍历,那么双向链表它可以从两个方向遍历。
双向链表可以进行通过节点访问上一级,也就是说双向链表相对于单向链表只有一个指向下级节点字段多了一个指向上一级节点的字段。
双向链表相对于单向链表只是多了一个对上级节点的引用
双向链表的实现与解析:
(1) 创建双向链表
双向链表节点和单向链表一样分为两个部分,第一个部分保存或者显示关于节点的信息,另一个部分存储下一个节点的地址。最后一个节点存储地址的部分指向空(null),区别在于双向链表节点不只是储存了下一个节点的地址,还储存了上一个节点的地址。
public class BothwayLinkedList {
private int size;
private Node head;//头节点
private Node tail;//尾节点
public BothwayLinkedList(){
size = 0;
head = null;
tail = null;
}
class Node{
public Object data;// 每个节点的数据
public Node prev;
public Node next;// 每个节点指向下一个节点的连接
public Node(Object data) {
this.data = data;
}
}
}
(2) 添加节点
添加头节点:
如同添加的是第一个节点那么直接将头尾节点均设为当前节点,当前节点的next与prev均指向null,若不是则将头节点的prev设置为当前节点,当前节点的next指向头节点,在把当前节点设置为头节点。
//添加 头节点
public void addHead(Object value) {
Node newNode = new Node(value);
if (size == 0) {
head = newNode;
tail = newNode;
size++;
} else {
head.prev = newNode;
newNode.next = head;
head = newNode;
size++;
}
}
添加尾节点:
如同添加的是第一个节点那么直接将头尾节点均设为当前节点,当前节点的next与prev均指向null,若不是则将该节点的prev设置为尾节点,尾节点的next设置为当前节点,当前节点设置为尾节点。
//在链表尾增加节点
public void addTail(Object value) {
Node newNode = new Node(value);
if (size == 0) {
head = newNode;
tail = newNode;
size++;
} else {
newNode.prev = tail;
tail.next = newNode;
tail = newNode;
size++;
}
}
(3)删除节点
删除头节点:
如果节点数为0则返回flase无法删除,若节点数为1则将头尾节点都等于null,若大于1则将头节点设置为头节点的next,在将头节点的prev指向null。
//删除 头节点
public boolean delectHead() {
if (size == 0) {
return false;
}
if (size == 1) {
head = null;
tail = null;
} else {
head = head.next;
head.prev = null;
}
size--;
return true;
}
删除尾节点:
如果节点数为0则返回flase无法删除,若节点数为1则将头尾节点都等于null,若大于1则将尾节点设置为尾节点的prev,在将尾节点的next指向null。
// 删除链表尾
public boolean deleteTail() {
if (size == 0) {
return false;
}
if (size == 1) {
head = null;
tail = null;
} else {
tail = tail.prev;
tail.next = null;
}
size--;
return true;
}
接下来的操作都和单向链表一样。
总结:
链表是一种基础数据结构,是一种线性表。
它只能从线的这一端顺着线一个一个的访问而不能随意访问。
单向链表:只有一个线头,只能在线头添加数据,并且每个节点只是记录了下一个节点的信息,访问只能从线头访问到末尾。
双端链表:有线头和线尾,也就是说它可以在线头添加数据也可以在线尾添加数据。他的节点信息和单向链表一样也就是说访问也是只能从线头访问到末尾。
双向链表:有线头和线尾,节点信息记录上一个节点和下一个节点信息,也就是说它可以在线头添加数据也可以在线尾添加数据,访问可以从线头访问到线尾也可以从线尾访问到线头
闭环:所有链表均可添加闭环,也就是把线头线尾连起来,从线头访问到线尾在跳到线头如此可以看成一个环。