链表的删除与修改及附录完整的增删改查源代码

数据结构链表

链表的删除

思路分析:

从单链表中删除一个节点的思路:
1.咱们先要找到,要删除的这个节点的前一个节点的temp。
2. temp.next=temp.next.next
3. 被删除的节点,将不会有其余任何指向,会被垃圾回收机制回收

HerNode

//定义一个HerNode,每一个HerNode对象就是一个节点
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;
  }
//重写toStrong方法
  @Override
  public String toString() {
      return "HerNode{" +
              "no=" + no +
              ", name='" + name + '\'' +
              ", nickname='" + nickname + '\'' +
              '}';
  }
}

del()

删除实现代码java

class SingleLinkedList{
// 先初始化一个头节点,头节点不要动,不存放具体的数据
  private  HeroNode  head =new HeroNode(0,"","");
// 删除节点
// 思路
// 1.head节点不能动,所以咱们须要一个temp辅助节点来找到要删除节点的前一个节点
// 22. 说明咱们在比较是,是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.printf("删除失败,编号为%d的节点不存在\n",no);
        }
    }
    }

测试代码:web

//删除
public class SingleLinkedListDemo {
    public static void main(String[] args) {
        HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨");
        HeroNode heroNode2 = new HeroNode(2, "卢俊义", "玉麒麟");
        HeroNode heroNode3 = new HeroNode(3, "吴用", "智多星");
        HeroNode heroNode4 = new HeroNode(4, "林冲", "豹子头");
        //显示
        singleLinkedList.list();
        //删除
        singleLinkedList.del(1);
        singleLinkedList.del(3);
        System.out.println("删除以后的结果...");
        singleLinkedList.list();
        }

链表的修改

update()

修改实现代码数据结构

class SingleLinkedList{
// 先初始化一个头节点,头节点不要动,不存放具体的数据
  private  HeroNode  head =new HeroNode(0,"","");
// 修改节点信息,根据no编号来修改,即no编号不能改
// 说明
// 1.根据newHero的no来修改
    public void update (HeroNode newHeroNode){
// 判断是否为空
        if(head.next==null){
            System.out.println("链表为空~");
            return;
        }
// z找到须要修改的节点 根据no
// 定义一个辅助变量
        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.printf("修改失败,您所要修改的的%d编号,不存在\n",newHeroNode.no );
        }

    }
    }

测试代码:ide

public class SingleLinkedListDemo {
    public static void main(String[] args) {
         HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨");
        HeroNode heroNode2 = new HeroNode(2, "卢俊义", "玉麒麟");
        HeroNode heroNode3 = new HeroNode(3, "吴用", "智多星");
        HeroNode heroNode4 = new HeroNode(4, "林冲", "豹子头");
        HeroNode heroNode5 = new HeroNode(4, "小范", "豹子头~");
        //显示
        singleLinkedList.list();
        //修改
          singleLinkedList.update(heroNode5);
        System.out.println("修改以后的结果...");
        singleLinkedList.list();
        }

附录(完整的链表代码增删改查)

package com.atg.linkedlist;

public class SingleLinkedListDemo {
    public static void main(String[] args) {
// 测试
// 先建立节点
        HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨");
        HeroNode heroNode2 = new HeroNode(2, "卢俊义", "玉麒麟");
        HeroNode heroNode3 = new HeroNode(3, "吴用", "智多星");
        HeroNode heroNode4 = new HeroNode(4, "林冲", "豹子头");
        HeroNode heroNode5 = new HeroNode(4, "小范", "豹子头~");

        // 建立一个链表
        // 加入
        SingleLinkedList singleLinkedList = new SingleLinkedList();
// singleLinkedList.add(heroNode4);
// singleLinkedList.add(heroNode1);
// singleLinkedList.add(heroNode2);
// singleLinkedList.add(heroNode3);
        System.out.println("链表展现详情...");
        singleLinkedList.addByOrder(heroNode1);
        singleLinkedList.addByOrder(heroNode2);
        singleLinkedList.addByOrder(heroNode3);
        singleLinkedList.addByOrder(heroNode4);
        //显示
        singleLinkedList.list();
        System.out.println("修改以后的结果...");
        singleLinkedList.update(heroNode5);
        singleLinkedList.list();
//删除

        singleLinkedList.del(1);
        singleLinkedList.del(3);

        System.out.println("修改以后的结果...");

        singleLinkedList.list();

    }
}
//定义SingleLinkedList,管理咱们的英雄
class SingleLinkedList{
// 先初始化一个头节点,头节点不要动,不存放具体的数据
    private  HeroNode  head =new HeroNode(0,"","");
// 添加节点到单向链表
// 思路不考虑编号顺序
// 1.找到当前链表的最后节点
// 2.将最后节点的next指向新的节点
    public  void add(HeroNode heroNode){
// 由于head节点不能动所以咱们须要借助temp来辅助遍历
        HeroNode temp=head;
// 遍历链表找到最后
        while (true){
// 找到最后
            if(temp.next==null){
                break;
            }
// 若是没有找到最后将temp后移
            temp=temp.next;
        }
// 当退出while循环是,temp就指向了链表的最后
// 将最后这个节点的next,指向新的节点
        temp.next=heroNode;
    }
// 显示链表[遍历]
    public void list(){
// 判断链表是否为空
        if(head.next==null){
            System.out.println("链表为空");
            return;

        }
// 由于head节点不能动所以咱们须要借助temp来辅助遍历,
// 由经if语句可得执行此处链表一定有一个数 ,故 HeroNode temp=head.next;
        HeroNode temp=head.next;
// 遍历链表找到最后
        while (true){
// 找到最后
            if(temp==null){
                break;
            }
// 输出节点信息
            System.out.println(temp);
// 若是没有找到最后将temp后移
            temp=temp.next;
//
    }
    }

// 第二种方式添加英雄时,根据排名插入到指定的位置
// 若是有这个排名,则添加失败并给出提示
    public  void addByOrder(HeroNode heroNode){
// 由于头部节点不能动,所以咱们须要经过一个辅助的指针(变量)来帮助咱们添加的位置
// 由于单链表,由于的咱们的temp是位于添加位置的前一个节点,不然插入不了
        HeroNode temp=head;
        boolean flag=false;//flag 标志添加的编号是否存在,默认为false
        while (true){
            if (temp.next==null){
// 说明temp已经在链表的最后
                break;
            }
            if (temp.next.no>heroNode.no){
// 位置找到,就在temp的后面插入
                break;
            }
            else if (temp.next.no==heroNode.no){
// 说明heroNode的编号已经存在
                flag = true;
                break;
            }
// 后移遍历链表
            temp=temp.next;
        }
// 判断flag
        if (flag){
// 不能添加 heroNode的编号已经存在
            System.out.printf("排名%d的英雄已存在,插入失败\n",heroNode.no);
        }else {
// 插入到链表中,temp的后面
            heroNode.next=temp.next;
            temp.next=heroNode;
        }
    }
// 修改节点信息,根据no编号来修改,即no编号不能改
// 说明
// 1.根据newHero的no来修改
    public void update (HeroNode newHeroNode){
// 判断是否为空
        if(head.next==null){
            System.out.println("链表为空~");
            return;
        }
// z找到须要修改的节点 根据no
// 定义一个辅助变量
        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.printf("修改失败,您所要修改的的%d编号,不存在\n",newHeroNode.no );
        }

    }
// 删除节点
// 思路
// 1.head节点不能动,所以咱们须要一个temp辅助节点来找到要删除节点的前一个节点
// 22. 说明咱们在比较是,是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.printf("删除失败,编号为%d的节点不存在\n",no);
        }
    }
}
//定义一个HerNode,每一个HerNode对象就是一个节点
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;
    }
//重写toStrong方法
    @Override
    public String toString() {
        return "HerNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickname='" + nickname + '\'' +
                '}';
    }
}