我的Java数据结构学习-4-2---链表 (CRUD)

节点对象:

package Demo1.LinkeList;

public 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;
    }

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

链表对象:

  初始化头节点:

 //初始化头节点,一般不会动他
    private HeroNode headNode = new HeroNode(0, "", "");

添加:

/添加节点到单向链表(顺序添加)
    public void addNode(HeroNode heroNode) {
        //不考虑编号顺序时候,找到当前链表的最后节点,将最后的节点的next域 指向新节点
        //因为head不能动,需要辅助指针(遍历链表)
        //System.out.println(heroNode);
        HeroNode temp = headNode;
        //遍历链表,找到当前链表的最后一位
        while (true) {
            //什么时候说明链表已经遍历到最后了,如果temp.next = null
            if (temp.next == null) {
                break;
            }
            //如果没有找到最后,temp的指针next域一致后移。
            temp = temp.next;
        }
        //退出while循环时,temp一定指向链表的最后
        temp.next = heroNode;
       // prinfList();

    }

  乱序添加,顺序加入:

//将节点插入到指定位置(!!)乱序插入,顺序排列
    public void addByOrder(HeroNode heroNode){
        //不能动head,所以使用辅助指针。
        HeroNode temp = headNode;
        //原始temp[data|next] -------temp-1【data|next】
        //现在是想要:temp[data|next] -----插入数据【data|next】--------temp-1【data|next】
        boolean tag = false;//标识添加编号是否存在
        while (true){
            if (temp.next==null){//说明已经到链表的最后了
                break;
            }
            if (temp.next.no>heroNode.no){//位置找到了
            break;
            }
            if (temp.next.no==heroNode.no){
                //存在该节点
                tag = true;
                break;
            }
            temp = temp.next;
        }
        //判断找到没有
        if (tag){
            //不能添加,说明编号存在!提示信息待插入的编号已经存在
            System.out.printf("准备插入的信息,已经存在:%d,不能加入\n",heroNode.no);

        }else {
            //插入到节点后面
            heroNode.next = temp.next;
            temp.next = heroNode;
        }

    }

修改节点信息,根据编号修改:

 //修改节点的信息,根据编号来修改,
    public  void updateNode(HeroNode heroNode){
        //判断链表是不是空的
        if (headNode.next==null){
            System.out.println("链表为空");
            return;
        }
        //辅助指针
        HeroNode temp = headNode;
        boolean tag = false;//表示是否找到
        //找到目标节点
        while (true){
            if (temp==null){
                    break;//已经走到了最后了,遍历完了未找到
            }
            if (temp.no==heroNode.no){
                //找到了
                tag = true;
                break;
            }
            temp = temp.next;
        }

        if (tag){
            temp.name =heroNode.name;
            temp.nickName = heroNode.nickName;
        }else {
            System.out.printf("未找到该【】目标节点,检查编号是否存在【%d】",heroNode.no);
        }
    }

删除节点:

 //删除节点
    public void  deleteNode(int nio){
        if (headNode.next==null){
            System.out.println("链表为空!!");
            return;
        }
        HeroNode temp = headNode;
        boolean flag = false;
        while (true){
            if (headNode.next==null){
                break;//走到了最后
            }
            if (temp.next.no == nio){//找到待删除的前一个结点。
                flag=true;
                break;//找到了就退出

            }
            temp = temp.next;//temp 后移
        }
        if (flag){
            //找了
            temp.next = temp.next.next;
        }else {
            System.out.printf("节点不存在:【%d】\n",nio);
        }
    }

控制台打印链表信息:

//显示链表信息【遍历打印链表】
    public void prinfList(){
        //判断链表是不是为空
        if (headNode.next ==null){
            System.out.println("链表为空::!!");
            return;
        }
        //头节点不能动,同样需要辅助遍历
        HeroNode temp = headNode.next;
        while (true){
            //判断链表是否是最后一个
            if (temp ==null){
                break;
            }
            //如果不为空
            System.out.println(temp);
            //还需要将temp后移,一定
            temp =temp.next;
        }
    }

 

测试:

package Demo1.LinkeList;

public class LinkedListTest {
    //测试

    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 singleLinkedList = new SingleLinkedList();
        //将节点加入链表
        singleLinkedList.addNode(heroNode1);
        singleLinkedList.addNode(heroNode4);
        singleLinkedList.addNode(heroNode3);
        singleLinkedList.addNode(heroNode2);
//根据编号自动排序加入
//        singleLinkedList.addByOrder(heroNode1);
//        singleLinkedList.addByOrder(heroNode4);
//        singleLinkedList.addByOrder(heroNode3);
//        singleLinkedList.addByOrder(heroNode2);
//        singleLinkedList.addByOrder(heroNode3);
        singleLinkedList.prinfList();
        System.out.println("-======================================-");
        //测试修改节点的代码
        HeroNode newheroNode2 = new HeroNode(2, "郭童", "白嫖郭");
        singleLinkedList.updateNode(newheroNode2);

        //测试删除节点
        singleLinkedList.deleteNode(4);
        //显示单链
        singleLinkedList.prinfList();
    }
}

HeroNode{no=1, name='顺悟空', nickName='孙行者', next=HeroNode{no=4, name='王五', nickName='隔壁老五', next=HeroNode{no=3, name='李四', nickName='隔壁老李', next=HeroNode{no=2, name='郭童', nickName='白嫖当', next=null}}}}
HeroNode{no=4, name='王五', nickName='隔壁老五', next=HeroNode{no=3, name='李四', nickName='隔壁老李', next=HeroNode{no=2, name='郭童', nickName='白嫖当', next=null}}}
HeroNode{no=3, name='李四', nickName='隔壁老李', next=HeroNode{no=2, name='郭童', nickName='白嫖当', next=null}}
HeroNode{no=2, name='郭童', nickName='白嫖当', next=null}
-======================================-
HeroNode{no=1, name='顺悟空', nickName='孙行者', next=HeroNode{no=3, name='李四', nickName='隔壁老李', next=HeroNode{no=2, name='郭童', nickName='白嫖郭', next=null}}}
HeroNode{no=3, name='李四', nickName='隔壁老李', next=HeroNode{no=2, name='郭童', nickName='白嫖郭', next=null}}
HeroNode{no=2, name='郭童', nickName='白嫖郭', next=null}

posted on 2020-08-05 10:39  白嫖老郭  阅读(90)  评论(0编辑  收藏  举报

导航