数据结构单链表的顺序插入节点
package com.yuteng.linkedlist;

/**
 * @version 1.0
 * @author: 余腾
 * @date: 2021-07-22 14:54
 */
public class SingleLinkedListDemo {
    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, "林冲", "豹子头");
        HeroNode hero5 = new HeroNode(5, "bzd", "bzd");
        //创建一个链表
        SingleLinkedList list = new SingleLinkedList();
        //加入数据
        list.addByOrder(hero1);
        list.addByOrder(hero4);
        list.addByOrder(hero5);
        list.addByOrder(hero2);
        list.addByOrder(hero3);
        list.addByOrder(hero4);

        //显示一下
        list.list();

    }
}

/**
 * 定义SingleLinkedList 管理我们的英雄
 */
class SingleLinkedList {
    /**
     * 先初始化一个头节点,头节点不要动,不存放具体的数据
     */
    private HeroNode head = new HeroNode(0, "", "");

    /**
     * 添加节点到单向链表
     * 思路:当不考虑编号顺序时
     * 1.找到当前链表的最后节点
     * 2.将最后这个节点的next指向新的节点即可
     *
     * @param heroNode 你想新建的链表的数据域
     */
    public void add(HeroNode heroNode) {
        //因为Head 节点不能动 因为我们需要一个辅助遍历temp
        HeroNode temp = head;
        //遍历链表,找到最后
        while (true) {
            //找到链表的最后
            if (temp.next == null) {
                break;
            }
            //如果找不到就让temp后移
            else {
                temp = temp.next;
            }
        }
        //当退出while循环时temp指向了链表的最后
        //将最后的这个节点的next指向新的节点
        temp.next = heroNode;
    }

    /**
     * 第二种添加方式在添加英雄时,根据排名将英雄插入到指定位置
     * // 如果这个排名存在,则添加失败,并给出提示
     *
     * @param heroNode
     */
    public void addByOrder(HeroNode heroNode) {
        HeroNode temp = head;
        //标识添加的编号是否存在,默认为false
        boolean flag = false;
        while (true) {
            //说明temp已经在链表的最后
            if (temp.next == null) {

                break;
            } else if (temp.next.no > heroNode.no) {
                break;
            } else if (temp.next.no == heroNode.no) {
                //希望添加的heroNode编号已经存在
                flag = true;
                break;
            }
            //后移
            temp = temp.next;
        }
        if (flag) {
            System.out.printf("不能添加,待插入的数据 %d 已存在\n", heroNode.no);
        } else {
            heroNode.next=temp.next;
            temp.next = heroNode;


        }

    }

    /**
     * 显示链表[遍历]
     */
    public void list() {
        //判断链表是否位为空
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        //因为头节点不能动因此我们需要一个辅助变量来遍历
        else {
            HeroNode temp = head.next;
            while (true) {
                //判断是否到最后了
                if (temp == null) {
                    break;
                }
                System.out.println(temp);
                //将next后移
                temp = temp.next;
            }
        }
    }
}

/**
 * 定义HeroNode节点,每个HeroNode 对象就是一个节点
 */
class HeroNode {
    public int no;
    public String name;
    public String nickname;
    public HeroNode next;

    public HeroNode(int hNo, String hName, String hNickname) {
        this.name = hName;
        this.no = hNo;
        this.nickname = hNickname;
    }

    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\'' +
                '}';
    }
}