我的Java数据结构学习-4-2---链表 (CRUD)

节点对象:

复制代码
package Demo1.LinkeList;

public 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 + '\'' +
                ", next=" + next +
                '}';
    }
}
复制代码

链表对象:

  初始化头节点:

 //初始化头节点,一般不会动他
    private HeroNode headNode = new HeroNode(0, "", "");

添加:

复制代码
/添加节点到单向链表(顺序添加)
    public void addNode(HeroNode heroNode) {
        //不考虑编号顺序时候,找到当前链表的最后节点,将最后的节点的next域 指向新节点
        //因为head不能动,需要辅助指针(遍历链表)
        //System.out.println(heroNode);
        HeroNode temp = headNode;
        //遍历链表,找到当前链表的最后一位
        while (true) {
            //什么时候说明链表已经遍历到最后了,如果temp.next = null
            if (temp.next == null) {
                break;
            }
            //如果没有找到最后,temp的指针next域一致后移。
            temp = temp.next;
        }
        //退出while循环时,temp一定指向链表的最后
        temp.next = heroNode;
       // prinfList();

    }
复制代码

  乱序添加,顺序加入:

复制代码
//将节点插入到指定位置(!!)乱序插入,顺序排列
    public void addByOrder(HeroNode heroNode){
        //不能动head,所以使用辅助指针。
        HeroNode temp = headNode;
        //原始temp[data|next] -------temp-1【data|next】
        //现在是想要:temp[data|next] -----插入数据【data|next】--------temp-1【data|next】
        boolean tag = false;//标识添加编号是否存在
        while (true){
            if (temp.next==null){//说明已经到链表的最后了
                break;
            }
            if (temp.next.no>heroNode.no){//位置找到了
            break;
            }
            if (temp.next.no==heroNode.no){
                //存在该节点
                tag = true;
                break;
            }
            temp = temp.next;
        }
        //判断找到没有
        if (tag){
            //不能添加,说明编号存在!提示信息待插入的编号已经存在
            System.out.printf("准备插入的信息,已经存在:%d,不能加入\n",heroNode.no);

        }else {
            //插入到节点后面
            heroNode.next = temp.next;
            temp.next = heroNode;
        }

    }
复制代码

修改节点信息,根据编号修改:

复制代码
 //修改节点的信息,根据编号来修改,
    public  void updateNode(HeroNode heroNode){
        //判断链表是不是空的
        if (headNode.next==null){
            System.out.println("链表为空");
            return;
        }
        //辅助指针
        HeroNode temp = headNode;
        boolean tag = false;//表示是否找到
        //找到目标节点
        while (true){
            if (temp==null){
                    break;//已经走到了最后了,遍历完了未找到
            }
            if (temp.no==heroNode.no){
                //找到了
                tag = true;
                break;
            }
            temp = temp.next;
        }

        if (tag){
            temp.name =heroNode.name;
            temp.nickName = heroNode.nickName;
        }else {
            System.out.printf("未找到该【】目标节点,检查编号是否存在【%d】",heroNode.no);
        }
    }
复制代码

删除节点:

复制代码
 //删除节点
    public void  deleteNode(int nio){
        if (headNode.next==null){
            System.out.println("链表为空!!");
            return;
        }
        HeroNode temp = headNode;
        boolean flag = false;
        while (true){
            if (headNode.next==null){
                break;//走到了最后
            }
            if (temp.next.no == nio){//找到待删除的前一个结点。
                flag=true;
                break;//找到了就退出

            }
            temp = temp.next;//temp 后移
        }
        if (flag){
            //找了
            temp.next = temp.next.next;
        }else {
            System.out.printf("节点不存在:【%d】\n",nio);
        }
    }
复制代码

控制台打印链表信息:

复制代码
//显示链表信息【遍历打印链表】
    public void prinfList(){
        //判断链表是不是为空
        if (headNode.next ==null){
            System.out.println("链表为空::!!");
            return;
        }
        //头节点不能动,同样需要辅助遍历
        HeroNode temp = headNode.next;
        while (true){
            //判断链表是否是最后一个
            if (temp ==null){
                break;
            }
            //如果不为空
            System.out.println(temp);
            //还需要将temp后移,一定
            temp =temp.next;
        }
    }
复制代码

 

测试:

复制代码
package Demo1.LinkeList;

public class LinkedListTest {
    //测试

    public static void main(String[] args) {
        //准备数据,创建几个节点。
        HeroNode heroNode1 = new HeroNode(1, "顺悟空", "孙行者");
        HeroNode heroNode2 = new HeroNode(2, "郭童", "白嫖当");
        HeroNode heroNode3 = new HeroNode(3, "李四", "隔壁老李");
        HeroNode heroNode4 = new HeroNode(4, "王五", "隔壁老五");
        //创建链表
        SingleLinkedList singleLinkedList = new SingleLinkedList();
        //将节点加入链表
        singleLinkedList.addNode(heroNode1);
        singleLinkedList.addNode(heroNode4);
        singleLinkedList.addNode(heroNode3);
        singleLinkedList.addNode(heroNode2);
//根据编号自动排序加入
//        singleLinkedList.addByOrder(heroNode1);
//        singleLinkedList.addByOrder(heroNode4);
//        singleLinkedList.addByOrder(heroNode3);
//        singleLinkedList.addByOrder(heroNode2);
//        singleLinkedList.addByOrder(heroNode3);
        singleLinkedList.prinfList();
        System.out.println("-======================================-");
        //测试修改节点的代码
        HeroNode newheroNode2 = new HeroNode(2, "郭童", "白嫖郭");
        singleLinkedList.updateNode(newheroNode2);

        //测试删除节点
        singleLinkedList.deleteNode(4);
        //显示单链
        singleLinkedList.prinfList();
    }
}
复制代码

HeroNode{no=1, name='顺悟空', nickName='孙行者', next=HeroNode{no=4, name='王五', nickName='隔壁老五', next=HeroNode{no=3, name='李四', nickName='隔壁老李', next=HeroNode{no=2, name='郭童', nickName='白嫖当', next=null}}}}
HeroNode{no=4, name='王五', nickName='隔壁老五', next=HeroNode{no=3, name='李四', nickName='隔壁老李', next=HeroNode{no=2, name='郭童', nickName='白嫖当', next=null}}}
HeroNode{no=3, name='李四', nickName='隔壁老李', next=HeroNode{no=2, name='郭童', nickName='白嫖当', next=null}}
HeroNode{no=2, name='郭童', nickName='白嫖当', next=null}
-======================================-
HeroNode{no=1, name='顺悟空', nickName='孙行者', next=HeroNode{no=3, name='李四', nickName='隔壁老李', next=HeroNode{no=2, name='郭童', nickName='白嫖郭', next=null}}}
HeroNode{no=3, name='李四', nickName='隔壁老李', next=HeroNode{no=2, name='郭童', nickName='白嫖郭', next=null}}
HeroNode{no=2, name='郭童', nickName='白嫖郭', next=null}

posted on   白嫖老郭  阅读(90)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示