一、双向链表介绍
双链是双向的,每一个节点内都存放了数据、下一个节点的地址next、上一个节点的地址prev
双链表比单链表多了一个prev用来存放上一个节点的地址.
结构如下图:
二、双链表对比单链表分析
1)单链表只能向后查找,而双链表可以向前向后查找。
2)单链表节点不能自我删除,需要找到待删除节点的前一个节点,而双向链表可以自我删除。
三、双链表的创建和增删改查
1)创建节点Node和双链表类DoubleLinkedList
class Node03{
public int data;
public Node03 next;//指向下一个节点,next内存储的是下一个节点的引用(地址),节点为Node03型,所以next也应该是Node03
public Node03 prev;//指向前一个节点
public Node03(int data) {
this.data = data;
}
@Override
public String toString() {
return "Node03{" +
"data=" + data +
'}';
}
}
class DoubleLinkedList{
//这个类里写增删改查方法
}
2)添加节点到双链表
//先创建一个head头节点,不存放数据
public Node03 head = new Node03(0);
//添加节点到双链表,不考虑data顺序时,下面是尾插法
//1.找到当前双链表的最后节点
//2.让最后节点的next指向新的节点,prev指向原来找到的最后节点
public void add(Node03 node03){
//head节点不能动,所以需要一个辅助变量temp
Node03 temp = head;
//遍历链表,找到尾节点
while (true){
//找到尾节点
if ( temp.next == null){
break;
}
//没找到的话就接着往后找,让temp后移
temp = temp.next;
}
//当退出while后,temp就指向最后节点
//将最后这个节点的next指向新的节点
temp.next = node03;
node03.prev = temp;
}
3)删除节点
1.遍历链表找到要删除的节点temp 2.让temp的前一个节点指向temp的下一个节点temp.prev.next=temp.next 3.让temp的下一个节点的prev换成temp的上一个节点temp.next.prev=temp.prev
//删除节点
//1.遍历链表找到要删除的节点temp
//2.让temp的前一个节点指向temp的下一个节点temp.prev.next=temp.next
//3.让temp的下一个节点的prev换成temp的上一个节点temp.next.prev=temp.prev
public void deleteNode(int key){
Node03 temp = this.head;
while (temp != null){
if(temp.data == key){
temp.prev.next = temp.next;
temp.next.prev = temp.prev;//这两部完成该节点得删除
temp = temp.next;//temp后移,继续找要删除的节点
}else {
temp = temp.next;//不相等就直接往后找
}
}
if(this.head.data==key) {//最后考虑头节点,如果相等再完成删除
this.head = this.head.next;
this.head.next.prev = this.head;
}
}