单链表

单链表(其二)

单向链表的修改和删除

背景

  • 数据结构——单向链表

  • 博主以b站尚硅谷Java数据结构与算法课进行学习

问题

  • 使用带head头的单向链表实现–水浒传排行榜管理

  • 完成单链表的修改和删除

思路

  • 修改:

    • 修改节点信息,根据编号来修改,即**no(编号)不能改,根据newHeroNode的no(编号)**来修改即可
    • 判断链表是否为空
    • 找到需要修改的节点的编号no
    • 定义一个辅助变量temp,设置flag变量判断是否找到该节点
  • 删除

    • 先找到需要删除的节点的前一个节点temp
    • temp.next = temp.next.next
    • 被删除的节点,不会被其它引用,会直接被回收

步骤

  • 修改

    • 先判断链表是否为空

    • 根据no编号,找到需要修改的节点

    • 定义一个辅助变量tempflag变量

      • 代码实现

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        public void upadate(HeroNode newHeroNode) {
        //判断链表是否为空
        if (head.next == null) {
        System.out.println("链表为空");
        }
        //找到需要修改的节点,根据no编号
        //定义一个辅助变量temp
        HeroNode temp = head.next;
        boolean flag = false;//表示是否找到该节点
        while (true) {
        if (temp == null) {
        break;//已经遍历完链表了
        }
        if (temp.no == newHeroNode.no) {
        flag = true;//找到
        break;
        }
        temp = temp.next;
        }
        // 根据flag判断是否找到要修改的节点
        if (flag) {
        temp.name = newHeroNode.name;
        temp.nickname = newHeroNode.nickname;
        } else {
        //没有找到
        System.out.println("没有找到");
        }
        }
  • 删除

    • head不能动,需要辅助变量temp节点找到删除节点的前一节点

    • 比较时是temp.next.no和删除节点的no比较

      • 代码实现

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        //删除链表
        //head不能动,需要辅助变量temp节点找到删除节点的前一个节点
        // 比较时,是temp.next.no和删除节点的no比较
        public void del(int no){
        HeroNode temp = head;
        boolean flag = false;//代表是否找到要删除的节点
        while(true){
        if(temp.next==null){//已经到了链表的最后
        break;
        }
        if(temp.next.no==no){
        //找到删除节点的前节点
        flag = true;
        break;
        }
        temp = temp.next;
        } if(flag){
        //可以删除
        temp.next = temp.next.next;
        }else{
        System.out.println("没有找到");
        }
        }

运行结果图

  • 修改

  • 删除