单链表按顺序插入节点
思路
注意: 因为该链表为单链表,所以我们找的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;}}
结果截图: