1.双向链表增删改 直接找到该节点即可,因为有pre可以找到上一个
2.设置 新插入节点时, Next: 先设置 newHead的 next Pre : 先设置 原来节点的前一个 指向新节点
static class HeroNodeD {
private int number;
private String name;
private String nickName;
private HeroNodeD next; 指向下一个
private HeroNodeD pre; 指向上一个
public HeroNodeD(int number, String name, String nickName) {
this.number = number;
this.name = name;
this.nickName = nickName;
}}
一.直接向最后添加
* 向 双向链表最后添加
public void add(HeroNodeD headNode) {
HeroNodeD tmp = HeadNode; //定一个临时变量指向头结点
while (true) {
if (tmp.next == null) { //如果头结点的下一位为空,那么将传入的节点设置为它的下一位
tmp.next = headNode;
headNode.pre=tmp; 设置插入的head的前一位
break;
}
tmp = tmp.next; //如果不为空,指向下一位 }}
二.顺序插入
1.与单链表类似,只是在需要 加入pre 2.判断当第一个插入时,判断 tmp.next!=null 不是最后一个 再设置它的 pre
顺序插入,并且不能重复插入已经存在的编号
public void addByOder(HeroNodeD headNode) {
HeroNodeD tmp = HeadNode; //将头结点,赋值给临时变量,以便操作
Boolean flag = false; //表示要插入的节点是否存在
while (true) {
if (tmp.next == null) { //已经最后一个了,直接插入
break;
}
if (tmp.next.number > headNode.number) {
//表示tmp的下一个大于headNode那么headNode就插入到tmp之后就行了
break;
} else if (tmp.next.number == headNode.number) {
flag = true;
break;
}
tmp = tmp.next;
}
if (flag == true) {
System.out.printf("已经存在%d号节点,不能插入~~\n", headNode.number);
} else { //可以插入
// 将headNode的下一位指向tmp的下一位
headNode.next = tmp.next;
if (tmp.next!=null){ //如果 tmp不是最后一个
tmp.next.pre = headNode; //就将tmp.下一个的前指向 新添的这个
}
//将tmp的下一位指向 headNode,
tmp.next = headNode;
headNode.pre=tmp; }}
三.修改节点与单链表一样
四.删除节点
1.判断最后一个删除时,判断 tmp.next!=null 不是最后一个 再设置它的 pre
2.直接找到删除节点 tmp.pre.next = tmp.next; tmp.next.pre=tmp.pre;
public void delete(int number) {
Boolean flag = false; //表示是否找到该节点
HeroNodeD tmp = HeadNode.next;
while (true) {
if (tmp == null) {
break;
}
if (tmp.number == number) { //找到该编号的上一个节点
flag = true;
break;
}
tmp = tmp.next;
}
if (flag) {
tmp.pre.next = tmp.next;
if (tmp.next!=null){
tmp.next.pre=tmp.pre;
}
} else {
System.out.printf("不存在该%d号节点\n", number); }}