Java数据结构-单链表2

该代码示例展示了如何在Java中使用单链表数据结构进行操作,包括按顺序插入结点、搜索并修改结点信息、以及删除结点。程序定义了一个HeroNode类表示结点,包含编号、名字和称号属性,以及一个SingleLinkedList2类来管理链表,提供了添加、按顺序添加、替换信息、删除结点和遍历链表的方法。

1、根据一定的规则进行插入结点

2、对结点进行搜索,修改

3、对结点进行删除,查找



import java.util.Scanner;

/*
按顺序进行插入链表
 */
public class LinkDemo2 {
    public static void main(String[] args) {
        SingleLinkedList2 l = new SingleLinkedList2();
        Scanner scanner = new Scanner(System.in);
        HeroNode2 h1 = new HeroNode2(1, "宋江", "及时雨");
        HeroNode2 h2 = new HeroNode2(2, "卢俊义", "玉麒麟");
        HeroNode2 h3 = new HeroNode2(3, "吴用", "智多星");
        HeroNode2 h4 = new HeroNode2(4, "林冲", "豹子头");
        try {
            l.addByOrder(h2);
            l.addByOrder(h3);
            l.addByOrder(h4);
            l.addByOrder(h1);
            // 检查链表

        } catch (Exception e) {
            e.printStackTrace();

        }
        System.out.println();
        System.out.println("原始链表结果为:");
        l.list();


        int id = 0;
        while (true) {
            System.out.println("是否需要进行修改?y or n");
            String key = scanner.next();
            if ("y".equals(key)) {
                System.out.println("请输入需要改的id号:");
                id = scanner.nextInt();
                if (id == -1) {
                    break;
                }
                System.out.println("请输入需要改的名字:");
                String name = scanner.next();
                System.out.println("请输入需要改的称号:");
                String nickname = scanner.next();


                l.replaceInfo(id, name, nickname, l);
                System.out.println("修改后链表的结果为:");
                l.list();
            } else {
//                System.exit(0);
                    break;
            }

        }
        l.delectNode(h3);
        l.delectNode(h1);
        l.delectNode(h1);
        l.delectNode(h4);
        l.list();


    }
}

class SingleLinkedList2 {
    // 初始化一个头节点,头节点不要动,不存放任何的数据
    private HeroNode2 head = new HeroNode2(0, "", "");

    // 尾插法
    public void add(HeroNode2 heroNode) {
        // 辅助变量
        HeroNode2 temp = head;
        // 遍历,直到最后尾部

        while (true) {
            if (temp.next == null) {
                break;
            }
            temp = temp.next;
        }
        temp.next = heroNode;

    }

    // 按顺序添加英雄,根据排名插入到指定的位置(如果有这个排名,则添加失败,并给出提示)
    public void addByOrder(HeroNode2 heroNode2) {
        HeroNode2 temp = head; // 指向头节点
        boolean flag = false;
        while (true) {
            if (temp.next == null) {
//                temp.next = heroNode2;
                break;
            } else {
                if (temp.next.no > heroNode2.no) {
//                    heroNode2.next = temp.next;
//                    temp.next = heroNode2;
                    break;

                } else if (temp.next.no == heroNode2.no) {
                    flag = true;

                } else if (heroNode2.no > 108) {
                    throw new RuntimeException("添加的英雄序号为:" + heroNode2.no + ",英雄序号不该大于108");

                }
                temp = temp.next;

            }

        }
        if (flag) {
            System.out.println("序号:" + heroNode2.no + ",英雄编号已存在,无法添加");
        } else {
            heroNode2.next = temp.next;
            temp.next = heroNode2;

        }

    }

    // 修改链表的内容
    public void replaceInfo(int id, String name, String nickname, SingleLinkedList2 s) {
        HeroNode2 temp = head;
        if (s.isEmpty()) {
            System.out.println("链表为空,无法执行操作");
            return;
        }
        // 寻找有效的id号
        while (temp != null && id != temp.no ) {
            temp = temp.next;
        }
        if (temp == null) {
            System.out.println("无法找到有效的id号");
            return; // 终止操作
        } else {
            // 如果找到,进行修改
            if (!("0".equals(name))) {
                temp.name = name;
            }
            if (!("0".equals(nickname))) {
                temp.nickname = nickname;
            }


        }

    }
    // 删除结点
    public void delectNode(HeroNode2 heroNode2){
        HeroNode2 temp = head;
        boolean flag = false;
        if(temp.next ==null){
            System.out.println("空链表");
            return;
        }

        while(true){
            if(temp.next == null){ // 找到最后也没找到编号
                break;
            }
            if(temp.next.no == heroNode2.no){ // 找到了编号的前一个
                flag = true;
                break;
            }
            temp = temp.next;

        }
        if(flag){
            temp.next = temp.next.next;

        }else{
            System.out.println("序号为:"+heroNode2.no+"的节点不存在或者已被删除掉了,链表中无法没找到相应的结点");
        }

    }

    // 判断链表是否为空
    public boolean isEmpty() {
        HeroNode2 temp = head;
        return (temp.next) == null;
    }

    // 显示链表[遍历]
    public void list() {
        HeroNode2 temp = head;
        if ((temp.next) == null) {
            System.out.println("空链表");
            return;

        }
        while (temp.next != null) {
            temp = temp.next;
            System.out.println(temp.toString());// 输出结点中的信息

        }
    }

}

// 英雄类的结点
class HeroNode2 {
    public int no;// 编号
    public String name;// 名字
    public String nickname; // 称号
    public HeroNode2 next;  // 下一个结点


    public HeroNode2(int n, String name, String nickname) {
        this.no = n;
        this.name = name;
        this.nickname = nickname;
    }

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值