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

Posted nathanielsv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单链表之实现(以及增删改查)相关的知识,希望对你有一定的参考价值。

 

 

//节点类(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;
        }


    }

以上为遍历链表

以上是关于单链表之实现(以及增删改查)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之双链表

python实现单链表的增删改查

python实现单链表的增删改查

java实现单链表增删改查

单链表的创建和增删改查实现

单链表的创建和增删改查实现