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

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

具体代码如下:
  • 这里我们给方法的形式给出代码
public void addByOrder(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;
            }else if(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的顺序添加结点,我们看遍历出来的结果是怎样的
测试代码如下:
package com.ffyc.linkedlist;

public class SingleLinkedListTest2 {
    public static void main(String[] args) {
        //先创建一些结点:
        HeroNode hero1 = new HeroNode(1,"宋江","及时雨");
        HeroNode hero2 = new HeroNode(2,"卢俊义","玉麒麟");
        HeroNode hero3 = new HeroNode(3,"吴用","智多星");
        HeroNode hero4 = new HeroNode(4,"林冲","豹子头");

        //创建一个链表
        SingleLinkedList singleLinkedList = new SingleLinkedList();

        //向链表中加入元素
        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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值