双向链表
双向链表
双向链表具有两个方向;有next域指向后一个节点;pre域指向前一个节点
双向链表的优点
- 单向链表,查找只能向一个方向;双向链表可以从前、后两个方向查找;
- 单向链表不能自我删除,需要靠辅助节点;我们总是找删除节点的前一个节点;双向链表可以自我删除。
双向链表的增删改查

分析思路
添加节点:直接添加到链表的后面
-
找到链表的尾部,添加节点 temp.next=null
-
temp.next=N N.pre=temp;
删除节点:双向链表可以实现自我删除
- 直接找到要删除的节点;
- temp.pre.next=temp.next temp.next.pre=temp.pre;
修改节点:和单链表一样
查看节点:遍历方法和单向链表一样,方向可以向前也可以向后;
//代码实现
//双向链表
//创建节点
class Node2 {
public String name;
public int No;
public Node2 next;//指向后面一个节点
public Node2 pre;//指向前面一个节点
public Node2() {
}
public Node2(String name, int no) {
this.name = name;
No = no;
}
}
//创建双向链表管理
class DoubleList{
//定义一个头节点
private Node2 head=new Node2();
//添加节点
public void add3(Node2 N){
Node2 temp = head;
while(true){
if(temp.next==null){//找到链表的末尾
break;
}
temp=temp.next;
}
temp.next=N;
N.pre=temp;
}
//删除指定节点
public void de(int no) {
if (head.next == null) {
System.out.println("链表为空");
return;
}
Node2 temp = head.next;
boolean flag = false;
while (true) {
if (temp == null) {//找到链表的尾部
break;
}
if (temp.No == no) {//找到删除的节点
flag = true;
break;
}
temp = temp.next;
}
if(flag) {
temp.pre.next = temp.next;
//如果最后一个节点,不需要执行下面这句话,否则出现空指针异常
if (temp.next != null) {
temp.next.pre = temp.pre;
}
}
else{
System.out.println("输入有无,无法删除");
}
}
//修改节点信息
public void change(Node2 N) {
//判断链表是否为空
if(head.next==null){
System.out.println("链表为空");
return;
}
//找到要修改的节点,根据编号来修改
//定义一个辅助变量
Node2 temp=head.next;
boolean flag=false;
//遍历完找到要修改的节点
while(true){
if(temp==null){//找到链表的最后
break;
}
if(N.No==temp.No){//找到要修改的链表
flag=true;
break;
}
temp=temp.next;
}
if(flag){
temp.name=N.name;
}
else{
System.out.println("无法修改");
}
}
//查看链表
public void show() {
//判断链表是否为空
if(head.next==null){
System.out.println("链表为空");
return;
}
Node2 temp=head.next;
while(true){
if(temp==null){
break;
}
System.out.println(temp.No+"+"+temp.name);
temp = temp.next;
}
}
}

浙公网安备 33010602011771号