一、应用实例
在上一节,已经实现了不按编号顺序添加,这一节,需要实现按英雄编号顺序添加到链表的指定位置,修改和删除指定节点。
二、思路
1)插入节点
1.同样需要遍历链表,需要一个辅助变量temp。
2.找到相应的位置时,需要先将node.next = temp.next,再将temp.next = node 这样就完成了添加。
3.相应的位置就是temp.next.no > node.no,即某节点的下一位的编号恰好大于新节点node.no
4.如果遍历到temp.next = = null时,说明链表到达结尾;
如果遍历到temp.next.no == node.no,这就说明该编号已存在,无法添加。
2)修改节点
1.首先需要判断链表是否为空。
2.需要遍历链表,所以需要一个辅助变量temp
3.设定一个flag初始值为false,如果找到对应编号,则对flag赋值为true
4.最后对flag判断,为true,就修改对应temp节点的值,false则输出未找到指定节点
3)删除节点
1.开头同样需要一个链表非空判断
2.同样的也是遍历链表,需要辅助变量temp,但是这里的temp必须指向要删除节点的前一个节点
3.同样需要一个flag,初始值为false,找到指定节点后,赋值为true
4.最后判断flag,为true,就将temp.next = temp.next.next 即可,未找到 则输出 未找到指定节点。
三、代码实现
插入节点的方法
public void addByOrder(HeroNode node) {
HeroNode temp = head;
//这里的标识用于检测编号是否有相同的
boolean flag = false;
while(true) {
if(temp.next == null) {
break;
}
if(temp.next.no>node.no) {
break;
}else if(temp.next.no == node.no) {
flag = true;
break;
}
temp = temp.next;
}
if(flag) {
System.out.println("编号"+node.no+"已存在,添加失败!");
}else {
node.next = temp.next;
temp.next = node;
}
}
修改节点的方法:
public void update(HeroNode newHeroNode) {
if(head.next == null) {
System.out.println("链表为空,无法修改节点!");
return;
}
HeroNode temp = head.next;
boolean flag = false;
while(true) {
if(temp == null) {
break;
}
if(temp.no == newHeroNode.no) {
flag = true;
break;
}
temp = temp.next;
}
if(flag) {
temp.name = newHeroNode.name;
temp.nickName = newHeroNode.nickName;
}else {
System.out.println("未找到相同编号的节点,修改操作失败!");
}
}
删除节点的方法
public void delete(int no) {
if(head.next == null) {
System.out.println("链表为空,无法删除节点!");
return;
}
HeroNode temp = head;
boolean flag = false;
while(true) {
if(temp.next == null) {
break;
}
if(temp.next.no == no) {
flag=true;
break;
}
temp = temp.next;
}
if(flag) {
temp.next = temp.next.next;
}else {
System.out.println("未找到编号为"+no+"的节点!");
}
}