首页 > 其他 > 详细

单链表(增删改查)

时间:2021-03-05 10:53:02      阅读:24      评论:0      收藏:0      [点我收藏+]

数据结构:单链表(增删改查)

准备一个结点类

class HeroNode {
    public int no;
    public String name;
    public String nickName;
    public HeroNode next; //指向下一个结点

    public HeroNode(int no, String name, String nickName) {
        this.no = no;
        this.name = name;
        this.nickName = nickName;
    }
}

准备一个链表类

class SingleLinkedList {
    //先初始化头结点
    private HeroNode head = new HeroNode(0, "", "");
    //定义一个尾结点,用于添加结点
    private HeroNode tail = head;
}

add()

public void add(HeroNode heroNode) {
        tail.next = heroNode;
        tail = heroNode;
}

按照结点编号升序插入链表

public void addByOrder(HeroNode heroNode) {
        HeroNode temp = head; //temp指向要比较的结点的前一个结点
        boolean flag = false; //标志添加的编号是否存在,默认false
        //寻找添加位置
        while (true) {
            if (temp.next == null) {//没找到插入位置,直接插入到链表尾
                break;
            }
            if (temp.next.no > heroNode.no) {//下一个结点no大于插入的no,前一个结点no小于插入的no
                break;
            } else if (temp.next.no == heroNode.no) {//说明希望添加的heroNode的编号已经存在
                flag = true;
            }
            temp = temp.next;//后移
        }
        //判断flag的值
        if (flag) {//编号存在,不能添加
            System.out.printf("准备插入的英雄编号%d 已经存在了,不能加入\n", heroNode.no);
        } else {//编号不存在,插入到链表中,temp指针后面
            heroNode.next = temp.next;
            temp.next = heroNode;
        }
    }

注意

? 如果链表中已经存在要插入的结点,则不能插入,并给出提示

update(HeroNode newHeroNode)

public void update(HeroNode newHeroNode) {
        //判断链表是否为空
        if (head.next == null) {
            System.out.println("链表为空!");
            return;
        }
        //找到需要修改的结点,根据no编号
        //定义遍历指针
        HeroNode temp = head;
        while (temp != null && temp.no != newHeroNode.no) {
            temp = temp.next;
        }
        if (temp == null) {
            System.out.printf("没有找到编号 %d 的结点,不能修改\n", newHeroNode.no);
        } else {
            temp.name = newHeroNode.name;
            temp.nickName = newHeroNode.nickName;
        }
    }

del(int no)

思路:找到待删除结点的前一个结点,temp指向要比较的结点的前一个位置,所以比较时是,temp.next.no == delNo

public void del(int no) {
        //判断链表是否为空
        if (head.next == null) {
            System.out.println("链表为空!");
            return;
        }
        //定义指针
        HeroNode temp = head;
        while (temp.next != null && temp.next.no != no) {
            temp = temp.next;
        }
        if (temp.next == null) {//没有找到删除结点,temp就移动到了链尾
            System.out.printf("没有找到编号 %d 的结点,不能删除\n", no);
        } else {//找到删除结点,temp指向链表中间
            temp.next = temp.next.next;
        }
}

打印链表

public void list() {
        //先判断链表是否为空
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        HeroNode temp = head.next;
        while (temp != null) {
            //输出结点信息
            System.out.println(temp);
            //将temp后移
            temp = temp.next;
        }
}

单链表(增删改查)

原文:https://www.cnblogs.com/fkPrograming/p/14484370.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!