数据结构+算法--单链表按顺序插入节点

2022-09-05 13:17:45

思路

在这里插入图片描述
注意: 因为该链表为单链表,所以我们找的temp 是位于添加位置的前一个节点,否则插入不了

代码实现(单链表按顺序插入节点)

import java.util.Scanner;publicclassSingleLinkedListDemo{publicstaticvoidmain(String[] args){

        SingleLinkedList singleLinkedList=newSingleLinkedList();boolean tar=true;while(tar){
            System.out.println("请选择你要执行的操作,add:往链表中添加数据  show:遍历整个链表 quit:退出程序");
            Scanner sc=newScanner(System.in);
            String str= sc.next();switch(str){case"add":
                    System.out.println("请输入新节点的序号:");int no= sc.nextInt();
                    System.out.println("请输入新节点的名字:");
                    String name= sc.next();
                    System.out.println("请输入新节点的昵称:");
                    String nickName= sc.next();
                    HeroNode newNode=newHeroNode(no, name, nickName);
                    singleLinkedList.addByOrder(newNode);break;case"show":
                    singleLinkedList.list();break;case"quit":
                    tar=false;break;}}}}//定义SingleLinkedList,管理我们的英雄classSingleLinkedList{//先初始化一个头节点,头节点不要动,不存放具体的数据public HeroNode head=newHeroNode(0,"","");//添加节点到单向链表//思路:当不考虑编号顺序时//1. 找到当前链表的最后节点//2. 将最后这个节点的next 指向 新的节点publicvoidadd(HeroNode heroNode){// 因为head节点不能动,因此我们需要一个辅助遍历temp
        HeroNode temp= head;//遍历链表,找到最后while(true){if(temp.next!= null){//如果没有找到最后,将temp后移
                temp= temp.next;continue;}//找到最后,就跳出循环break;}//当退出while循环时,temp就指向了链表的最后//将最后这个节点的next 指向 新的节点
        temp.next= heroNode;}//第二种方式在添加英雄时,根据排名将英雄插入到指定位置//(如果有这个排名,则添加失败,并给出提示)publicvoidaddByOrder(HeroNode heroNode){// 因为head节点不能动,因此我们仍然通过一个辅助指针(变量)来帮助找到添加的位置//因为该链表为单链表,所以我们找的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;}elseif(temp.next.no== heroNode.no){//说明希望添加的heroNode的编号已经存在
                flag=true;//说明编号存在break;}

            temp= temp.next;//temp后移,遍历当前链表}//判断flag的值if(flag){//不能添加,说明编号已经存在
            System.out.printf("准备插入的英雄的编号 %d 已经存在了,不能加入\n",heroNode.no);}else{//插入到链表中,temp的后面
            heroNode.next= temp.next;
            temp.next= heroNode;}}//    public void addByOrder2(HeroNode heroNode){//        // 因为head节点不能动,因此我们需要一个辅助遍历temp//        HeroNode temp = head;////        while(true){////            if(temp.next == null){//                //当前链表为空或者 temp 已经遍历到链表的最后,可以直接插入//                temp.next = heroNode;//                break;//            }////            if(heroNode.no == temp.next.no){//                System.out.println("添加失败,链表中已有该排名");//                break;//            }//            if(heroNode.no < temp.next.no){////                heroNode.next = temp.next;//                temp.next = heroNode;//                break;//            }//            temp = temp.next;//        }//    }//显示链表【遍历】publicvoidlist(){//判断链表是否为空if(head.next== null){thrownewRuntimeException("链表为空,没有数据,请先添加数据再打印");}//因为头节点不能动,因此我们需要一个辅助变量来遍历
        HeroNode temp= head.next;while(true){//输出节点的信息
            System.out.println("序号:"+temp.no);
            System.out.println("姓名:"+temp.name);
            System.out.println("昵称:"+temp.nickName);
            System.out.println("-----------------------------------");//判断是否到链表最后if(temp.next== null){break;}//将temp后移,一定要注意
            temp= temp.next;}}}//定义HeroNode,每个HeroNode 对象就是个一个节点classHeroNode{publicint no;public String name;public String nickName;public HeroNode next;//指向下一个节点//构造器publicHeroNode(int no, String name, String nickName){this.no= no;this.name= name;this.nickName= nickName;}}

结果截图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 作者:Hello_World&amp;Java
  • 原文链接:https://blog.csdn.net/xiaoheijjkjkjk/article/details/112278163
    更新时间:2022-09-05 13:17:45