双向链表
简介:双向链表是包含向前指针的单链表,可以向前向后查找;单链表删除时需要借助辅助节点temp,而双向链表可以自我删除。
双向链表的应用实例
- 遍历:和单链表相同,只是可以向前,也能向后;
- 添加:默认添加到链表最后;
- 先找到最后一个节点
- temp.next = newNode;
- newNode.pre = temp;
public void add(HeroNode2 heroNode){
//因为head节点不能动,需要一个辅助变量遍历temp
HeroNode2 temp = head;
while(true){
//找到链表的最后
if(temp.next==null){
break;
}
temp = temp.next;
}
//将最后一个节点的next指向新的节点
temp.next = heroNode;
heroNode.pre = temp;
}
按照顺序添加:可以画图辅助理解:
public void addByOrder(HeroNode2 heroNode){
HeroNode2 temp = head;
boolean flag = false;
while(true){
if(temp.next==null){
break;
}
if(temp.next.no>heroNode.no){
break;
}
if(temp.no==heroNode.no){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
System.out.printf("准备插入编号%d的已经存在,不能加入",heroNode.no);
}
else{
//注意赋值的顺序
heroNode.next = temp.next;
heroNode.pre = temp;
temp.next = heroNode;
temp.next.pre =heroNode;
}
}
- 修改:和单链表相同;
- 删除:可以自我删除
- temp.pre.next =temp.next;
- temp.next.pre=temp.pre;
- 删除时要注意删的节点是不是最后一个节点。
public void delete(int no){
if (head.next == null) {
System.out.println("链表为空");
return;
}
HeroNode2 temp = head.next;
boolean flag = false;
while(true){
if(temp==null){
break;
}
if(temp.next.no==no){
temp.pre.next =temp.next;
//如果是最后一个节点就不需要执行下面一句话,否则会出现空指针异常
if (temp.next!=null) {
temp.next.pre = temp.pre;
}
flag = true;
System.out.println("删除成功");
break;
}
temp = temp.next;
}
if(!flag){
System.out.println("该节点不存在,无法删除");
}
}