单链表按照指定顺序插入节点(代码实现) [数据结构][Java]

2022-09-06 08:57:23

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

具体代码如下:

  • 这里我们给方法的形式给出代码
publicvoidaddByOrder(HeroNode heroNode){//因为头结点不能动,所以我们还是通过一个辅助指针来帮助我们找到添加元素的位置HeroNode temp= head;/*
        注意temp(辅助指针)是从头结点开始的,因为我们可能插入的位置就是在头结点之后的位置
         *///定义一个boolean型的变量flag , flag标志添加的编号是否已经存在,默认为false,为false就是编号不存在,就是可以添加boolean flag=false;while(true){if(temp.next==null){//说明temp已经在链表的最后了break;}/*
                这个时候一定要使用temp的next的on去和heroNode的no去比较,而不是直接使用temp和heroNode去比较
                 */if(temp.next.no> heroNode.no){//找到了元素在链表中插入的位置,位置就在temp的后面break;}elseif(temp.next.no== heroNode.no){//这个时候就表明我们的链表中已经是存在这个编号的结点了,这个时候我们就不能添加这个节点,那么我们就要将flag设置为true
                flag=true;break;}//指针下移
            temp= temp.next;}//判断flag的值if(flag){//这个时候进入到这里就说明flag的值为true,也就是说: 我们的链表中已经有这个编号值了,这个时候添加失败,我们给出提示就可以了System.out.printf("准备插入的英雄的编号%d已经存在了,不能加入\n",heroNode.no);}else{//将节点插入到链表中,temp的后面
            heroNode.next= temp.next;
            temp.next= heroNode;}}}
  • 使用这方法在链表中添加结点的时候是根据结点的no属性值来判断添加的位置的,下面我们来做一个测试,我们不按照no的顺序添加结点,我们看遍历出来的结果是怎样的

测试代码如下:

packagecom.ffyc.linkedlist;publicclassSingleLinkedListTest2{publicstaticvoidmain(String[] args){//先创建一些结点:HeroNode hero1=newHeroNode(1,"宋江","及时雨");HeroNode hero2=newHeroNode(2,"卢俊义","玉麒麟");HeroNode hero3=newHeroNode(3,"吴用","智多星");HeroNode hero4=newHeroNode(4,"林冲","豹子头");//创建一个链表SingleLinkedList singleLinkedList=newSingleLinkedList();//向链表中加入元素
        singleLinkedList.addByOrder(hero1);
        singleLinkedList.addByOrder(hero4);
        singleLinkedList.addByOrder(hero3);
        singleLinkedList.addByOrder(hero2);//打印结果(也就是显示结果)
        singleLinkedList.list();}}
  • 这个时候我们可以发现我们添加结点的时候是按照1,4,3,2的顺序添加的,但是我们遍历的时候我们可以发现我们输出的时候是按照1,2,3,4的顺序遍历的,为什么?
    • 我们遍历还是从头到尾进行遍历的,但是这个时候遍历的顺序就是1,2,3,4 ,那么这个时候其实是因为我们添加元素的时候不是调用的我们之前声明的add()方法,而是调用我们新创建的addByOrder()方法来添加的元素,而我们的addByOrder()方法添加结点的时候是根据添加的结点的no属性来添加的
      • 所以这个时候我们添加的时候是先添加的hero1结点,添加hero1结点的时候表中是没有结点的(除了头结点以外),所以直接就将hero1结点添加到了头结点之后的位置上,添加第二个节点的时候是添加的hero4节点,这个时候hero4节点的no属性值比hero1节点的no属性的值要大,所以我们经过addByOrder()方法添加的时候最终temp辅助指针就会停留在链表中最后一个节点的位置上,这个时候我们的hero4自然就是连接到了我们的链表中的最后一个节点的后面了, 然后我们添加第三个结点的时候添加的是hero3,这个时候我们的hero3的no属性要比hero4的no属性的值小,这个时候也就是我们的hero3要添加到我们的hero1和hero4之间的位置上,然后我们添加第四个节点的时候我们是添加的hero2结点,这个时候我们的hero2结点比hero3结点的no属性小,比hero1结点的no属性大,所以这个时候我们的hero2结点就是要添加到我们的hero3和hero4中间的位置上,所以最终添加完成之后我们的结点的在单链表中的存储顺序就是: hero1 --> hero2 —> hero3 —> hero4 ,所以我们遍历的顺序才是hero1,hero2,hero3,hero4
  • 作者:打更人学java
  • 原文链接:https://blog.csdn.net/m0_57001006/article/details/126414335
    更新时间:2022-09-06 08:57:23