什么是双向链表
双向链表就是每个节点都有它的前驱和后置节点指针,Java中没有指针的概念,可以使用对象地址来表示。
从上图可以看出首节点前驱指向null,尾节点的后置指向null。
Java实现双向链表
双向链表中我们需要定义个节点node对象,它包含前驱和后置节点,如下:
private static class Node{
Integer data;//data
Node prev ;//前驱
Node next;//后置
public Node(Integer data) {
this.data = data;
}
}
然后再定义我们的链表类LinkedList,它包含新增节点、删除节点和显示节点三个方法。
public void show();//显示
public void add(Integer data)//添加节点
public void del(Integer data);//删除节点
这里为了理解双向列表,节点data的定义为简单的Integer类型。完整代码如下:
/**
* Java实现双向链表
*/
class LinkedList{
private Node head = new Node(0); //头部节点
//定义内部类节点Node
private static class Node{
Integer data;//data
Node prev ;//前驱
Node next;//后置
public Node(Integer data) {
this.data = data;
}
}
/**
* show
*/
public void show(){
Node temp = head;
while (true) {
if (temp.next == null) {
break;
}
System.out.println(temp.next.data);
temp = temp.next;
}
}
/**
* 添加元素
* @param data
*/
public void add(Integer data){
Node node = new Node(data);
Node temp = this.head;
while(true){
if(temp.next == null){
break;
}
//找到链表的尾部
temp = temp.next;
}
temp.next = node;
node.prev = temp;
}
/**
* 删除元素
* @param data
*/
public void del(Integer data){
Node temp = this.head;
while(true){
//向下继续找
temp = temp.next;
if (head.next == null) {
System.out.println("空链表");
break;
}
if (null == temp) {
System.out.println("节点不存在");
}
//找当相等的元素
if(temp.data == data){
//当前节点的前驱指向当前节点的后置
temp.prev.next = temp.next;
temp.next.prev = temp.prev;
break;
}
}
}
}
public class HelloWorld{
public static void main(String args[]){
LinkedList list = new LinkedList();
list.add(1);
list.add(2);
list.add(3);
list.del(2);
list.show();
}
}
在上面的代码中,我们在双向链表中添加了1,2,3并删除了2。
结果输出如下:
1
3
3
双向链表特点
从上面的代码中我们可以看到它有如下特点:
- 1、可以使用一个head和一个tail分别指向头部和尾部的节点
- 2、每个节点都由三部分组成Data,prev,next
- 3、双向链表的第一个节点的prev是null
- 4、双向链表的最后节点的next是null