概念
节点类:
public class HeroNode {
public int no;
public String name;
public String nickName;
public HeroNode next; //指向下一个节点
public HeroNode pre;//指向上一个节点
...
}
链表类同单链表
基本思路
- 遍历方式通单链表,只是可前可后
- 添加(默认添加到最后)
(1)找到链表最后的节点
(2)temp.next = newHeroNode;
(3)newHeroNode.pre = temp;
public void add(HeroNode heroNode){
HeroNode temp = head;
while(true){
if(temp.next == null){
break;
}
temp = temp.next;
}
temp.next = heroNode;
heroNode.pre = temp;
}
- 修改同单链表
- 删除
(1)因为是双向链表,因此我们可以实现自我删除某个节点
(2)直接找到要删除的店temp
(3)temp.pre.nexy = temp.next;
(4)temp.next.pre = temp.pre;
public void delete(int no){
if(head.next == null){
System.out.println("链表为空");
return;
}
boolean flag = true;//是否找到待删除的节点
HeroNode temp = head.next;
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("要删除的"+no+"节点不存在");
}
}
- 按序号添加
public void addById(HeroNode heroNode){
//我们要找的temp是newHero的前一个
HeroNode temp = head;
//要添加的id是否已存在
boolean flag = false;
while (true){
if(temp.getNext() == null)
break;
else if(temp.getNext().no>heroNode.no)//位置已找到,因为下一个比它大
break;
else if(temp.getNext().no == heroNode.no){
flag = true;
break;
}
else
temp = temp.getNext();
}
//循环结束
if(flag){
System.out.println("id"+heroNode.no+"已存在,无法添加");
}else {
temp.next.pre = heroNode;
heroNode.next = temp.next;
temp.next = heroNode;
heroNode.pre = temp;
}
}