其他分享
首页 > 其他分享> > 单链表之实现(以及增删改查)

单链表之实现(以及增删改查)

作者:互联网

 

 

//节点类(jdk源码中的Node)
class HeroNode{

    //这里方便调用,把属性定义为public,一般不允许
    public int id;

    public String name;

    public String nickName;

    //下一节点的指针
    public HeroNode next;

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

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

上面代码为自定义的一个节点类,由上图可知单向链表的逻辑关系图

//单链表类
class SingleLinkList{

    //创建链表时先初始化一个头节点,这个头节点不放任何数据,用来指名这个链表的存在
    private HeroNode head = new HeroNode(0,"","");

    //往单链表中添加节点
    public void add(HeroNode heroNode){
        //需要遍历节点,找出next==null的尾节点。
        HeroNode temp = head;
        while(true){
            if(temp.next ==null){
                break;
            }
            temp = temp.next;
        }
        temp.next = heroNode;
    }
}

以上代码仅仅为往链表中插入节点数据

  //往单链表中顺序插入
    public void addByOrder(HeroNode heroNode){
        //需要遍历节点,找出next==null的尾节点。
        HeroNode temp = head;
        boolean flag = false; //这是一个标记位,用来指示
        while(true){//这就是一个遍历的过程
            if(temp.next ==null){ //说明temp已经是链表的最后了。这段逻辑判断必须放在第一位,可以有效防止空指针
                break;
            }
            if(temp.next.id>heroNode.id){
                break;
            }else if(temp.next.id == heroNode.id){ //这里必须要用下一个节点去判断,【如果是空链表,这时会报空指针】
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if(flag){
            System.out.printf("当前链表中需要加入的节点已经存在,节点id为:%d\n",heroNode.id);
        }else{
            heroNode.next=temp.next; //指向节点改变
            temp.next = heroNode;
        }

    }

 

 

以上为节点排序插入(边插边排序)

  //修改节点
    public void updateNode(HeroNode newHeroNode){
        if(head.next ==null){
            System.out.println("链表为空");
            return;
        }
        HeroNode temp = head;
        boolean flag = false;
        while(true){
            if(temp.next==null){
                break;
            }
            if(temp.next.id == newHeroNode.id){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if(flag){
            temp.next.name = newHeroNode.name;
            temp.next.nickName = newHeroNode.nickName;
        }else{
            System.out.printf("未找到id为%d的节点\n",newHeroNode.id);
        }

    }

以上为修改节点

  //删除节点
    public void delNode(int id){
        if(head.next ==null){
            System.out.println("链表为空");
            return;
        }
        HeroNode temp = head;
        boolean flag = false;
        while(true){
            if(temp.next ==null){
                break;
            }
            if(temp.next.id == id){
                flag = true;
                break;
            }
            temp= temp.next;
        }
        if(flag){
            temp.next = temp.next.next;
        }else{
            System.out.printf("未找到id为%d的节点\n",id);
        }
    }

以上为删除节点

    //遍历链表
    public void showList(){
        //判断链表是否为空
        if(head.next ==null){
            System.out.println("链表为空");
            return;
        }
        HeroNode temp = head.next;
        while (true){
            if(temp == null){
                break;
            }
            System.out.println(temp);
            temp = temp.next;
        }


    }

以上为遍历链表

标签:temp,HeroNode,改查,next,链表,表之,增删,节点,id
来源: https://www.cnblogs.com/Theozhu/p/14801156.html