大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~
希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!!
加油吧!未来可期!!!
接着实现按照编号排序的简单单链表,现在对单链表的结点进行修改。 实现想法:对于同一编号的结点进行修改结点的内容,实现的过程不是通过先进行删除结点,再插入结点的方式来修改。而是通过创建一个新结点,新结点的编号与要修改的结点编号相同,新结点的内容是修改后的内容。简单来说,就是把新结点的内容更新到要修改结点的内容中去,不对链表进行操作。 实现代码如下:
package linkedlist;/* <---这是包名
-*- coding:utf-8 -*-
作者:bob-coding
日期:2022年04月02日11:09
冲冲冲!!!*/
public class SingleLinkedListDemoO3 {
public static void main(String[] args) {
//进行测试
//先创建节点
HeroNode hero1 = new HeroNode(1,"a","a");
HeroNode hero2 = new HeroNode(3,"b","b");
HeroNode hero3 = new HeroNode(2,"c","c");
HeroNode hero4 = new HeroNode(4,"d","d");
SingleLinkedList singleLinkedList1 = new SingleLinkedList();
SingleLinkedList singleLinkedList2 = new SingleLinkedList();
//无序插入结点法
// singleLinkedList.add(hero1);
// singleLinkedList.add(hero4);
// singleLinkedList.add(hero2);
// singleLinkedList.add(hero3);
//有序插入结点法
singleLinkedList1.addByOrder(hero1);
singleLinkedList1.addByOrder(hero4);
singleLinkedList1.addByOrder(hero2);
singleLinkedList1.addByOrder(hero3);
//修改前链表
System.out.println("-----修改前链表-----");
singleLinkedList1.list();
singleLinkedList2.addByOrder(hero1);
singleLinkedList2.addByOrder(hero4);
singleLinkedList2.addByOrder(hero2);
singleLinkedList2.addByOrder(hero3);
//更新结点
HeroNode newHeroNode = new HeroNode(3,"bb","bb");
singleLinkedList2.update(newHeroNode);
//修改后链表
System.out.println("-----修改后链表-----");
singleLinkedList2.list();
}
}
定义SingleLinkedList
class SingleLinkedList{
private HeroNode head = new HeroNode(0,"","");
//加入节点
public void add(HeroNode heroNode){
HeroNode temp = head;
while(true){
//找到链表的最后
if(temp.next == null){
break;
}
temp = temp.next;
}
//当退出while循环时,temp就指向了链表的最后
//将最后这个节点的next 指向 新的节点
temp.next = heroNode;
}
//按顺序插入结点
//第二种方式在添加时,根据编号将结点插入到指定位置
//(如果有这个排名,则添加失败,并给出提示)
public void addByOrder(HeroNode heroNode){
//因为头节点不能动,因此我们仍然通过一个辅助指针(变量)来帮助找到添加的位置
//因为单链表,因为我们找的temp 是位于 添加位置的前一个节点,否则插入不了
HeroNode temp = head;
boolean flag = false;// flag标志添加的编号是否存在,默认为false
while(true){
if(temp.next == null){//说明temp已经在链表的最后
break;
}
if(temp.next.no > heroNode.no){//位置找到,就在temp的后面插入
break;
}else if(temp.next.no == heroNode.no){//说明希望添加的heroNode的编号已然存在
flag = true;
break;
}
//temp.next.no < heroNode.no
temp = temp.next;
}
//判断flag 的值
if(flag){
System.out.printf("将插入的结点已经存在,该结点为%d 无法插入",heroNode.no);
}else{//插入结点
heroNode.next = temp.next;
temp.next = heroNode;
}
}
//修改结点信息,根据no来进行修改,不改变no的编号
//说明
//1. 根据 newHeroNode 的 no 来修改即可
public void update(HeroNode newheroNode){
//判断链表是否为空
HeroNode temp = head;
if(head.next == null){
System.out.println("该链表为空,无法进行修改");
return;
}
// while(true){
// if(temp.next == null){
// break;
// }
// if(temp.next.no =! newheroNode.no){
// temp = temp.next;
// }
// if(temp.next.no == newheroNode.no){
// newheroNode.next = temp.next;
// temp.next = newheroNode;
// break;
// }
// }
boolean flag = false;
while(true){
if(temp.next == null){
break; //已经遍历完链表
}
if(temp.next.no == newheroNode.no){
flag = true;
break;//找到结点
}
temp = temp.next;
}
//根据flag 判断是否找到要修改的节点
if(flag){
// newheroNode.next = temp.next;
// temp.next = newheroNode;
temp.next.name = newheroNode.name;
temp.next.nickname = newheroNode.nickname;
}else{
//没有找到
System.out.printf("没有找到 编号 %d 的节点,不能修改\n", newheroNode.no);
}
}
//遍历显示链表
public void list(){
//判空
if(head.next == null){
System.out.println("链表为空");
return;
}
HeroNode temp = head.next;
while(true) {
//找到链表的最后
if (temp == null) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
}
//定义HeroNode , 每个HeroNode 对象就是一个节点
class HeroNode{
public int no;
public String name;
public String nickname;
public HeroNode next;
public HeroNode(int no, String name, String nickname) {
this.no = no;
this.name = name;
this.nickname = nickname;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickname='" + nickname + '\'' +
'}';
}
}
实现效果如下: