zoukankan      html  css  js  c++  java
  • 单向链表简单实现-->根据排名插入指定位置(增删改查)

    新增

    删除

     代码实现如下:

    public class SingleLinkedListDemo {
    
        public static void main(String[] args) {
            //先创建节点
            HeroNode hero1 = new HeroNode(1, "宋江", "及时雨");
            HeroNode hero2 = new HeroNode(2, "卢俊义", "玉麒麟");
            HeroNode hero3 = new HeroNode(3, "吴用", "智多星");
            HeroNode hero4 = new HeroNode(4, "林冲", "豹子头");
            
            //创建链表
            SingleLinkedList list = new SingleLinkedList();
            //加入
            list.addByOrder(hero1);
            list.addByOrder(hero4);
            list.addByOrder(hero3);
            list.addByOrder(hero2);
            list.addByOrder(hero2);
            //显示
            list.list();
            HeroNode hero5 = new HeroNode(3, "吴1用", "智1多星");
            list.update(hero5);
            list.list();
            System.out.println("------------");
            list.del(4);
            list.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;
            }
            temp.next = heroNode;
        }
        //修改节点的信息 根据no编号来修改  no不变
        //1.根据newHeroNode的no来修改即可
        public void update(HeroNode newHeroNode){
            //判断是否为空
            if(head.next==null){
                System.out.println("链表为空~~");
                return;
            }
            //找到需要修改的节点 根据no编号
            HeroNode temp = head.next;
            boolean flag = false;
            while(true){
                //找到链表的最后
                if(temp.next==null){
                    break;
                }
                if(temp.no==newHeroNode.no){//找到
                    flag = true;
                    break;
                }
                //如果不是最后一个  temp后移
                temp = temp.next;
            }
            if(flag){
                temp.name = newHeroNode.name;
                temp.nickname = newHeroNode.nickname;
            }else{
                System.out.printf("没有找到%d的节点",newHeroNode.no);
            }
        }
        //第二种方式在添加英雄时,根据排名将英雄插入到治党的位置
        //(如果有排名,则添加失败并给出提示)
        public void addByOrder(HeroNode heroNode){
            //因为head节点不能动 因此我们仍然需要一个辅助变量 temp 来帮助我们找到添加的位置
            //因为是单链表,因此我们找的temp 是添加位置的前一个节点 否则不插入
            HeroNode temp = head;
            
            boolean flag = false;//表示添加的编号是否存在,默认fasle 
            
            //遍历链表找到最后
            while(true){
                //找到链表的最后
                if(temp.next==null){//说明temp 已经在链表的最后
                    break;
                }
                if(temp.next.no>heroNode.no){//位置找到 就在temp后面插入
                    break;
                }else if(temp.next.no==heroNode.no){//说明编号存在
                    flag = true;
                    break;
                }
                //如果不是最后一个  temp后移
                temp = temp.next;
            }
            if(flag){
                System.out.printf("准备加入的编号%d已经存在
    ",heroNode.no);
                
            }else{
                heroNode.next = temp.next;
                temp.next = heroNode;
                
            }
        }
        
        //删除节点
        //思路:
        //1.head 不能动 因此我们需要一个temp辅助节点 找到待删除节点的前一个节点
        //2.说明我们在比较时 temp.next.no和我们要删除的节点no比较
        public void del(int no){
            HeroNode temp = head;
            boolean flag = false;
            while(true){
                if(temp.next==null){ //m没有找到待删除的节点
                    break;
                }
                if(temp.next.no == no){//找到目标
                    flag = true;
                    break;
                }
                temp = temp.next;
            }
            if(flag){
                temp.next = temp.next.next;
            }else{
                System.out.printf("没有找到要删除的节点%d",no);
            }
        }
        
        //显示链表【遍历】
        public void list(){
            //判断链表是否为空
            if(head.next == null){
                System.out.println("链表为空...");
                return;
            }
            //因为头结点不动 所以用一个辅助变量
            HeroNode temp = head.next;
            while(true){
                //判断是否在链表的最后
                if(temp==null){
                    break;
                }
                //输出节点信息
                System.out.println(temp.toString());
                temp = temp.next;
            }
        }
    }
    
    //定义HeroNode,每个HeroNode 对象就是一个节点
    class HeroNode{
        public int no;
        public String name;
        public String nickname;
        public HeroNode next;
        
        //构造器
        public HeroNode(int no, String name, String nickname) {
            super();
            this.no = no;
            this.name = name;
            this.nickname = nickname;
        }
    
        @Override
        public String toString() {
            return "HeroNode [no=" + no + ", name=" + name + ", nickname="
                    + nickname + "]";
        }
        
    }

    测试打印:

    准备加入的编号2已经存在
    HeroNode [no=1, name=宋江, nickname=及时雨]
    HeroNode [no=2, name=卢俊义, nickname=玉麒麟]
    HeroNode [no=3, name=吴用, nickname=智多星]
    HeroNode [no=4, name=林冲, nickname=豹子头]
    HeroNode [no=1, name=宋江, nickname=及时雨]
    HeroNode [no=2, name=卢俊义, nickname=玉麒麟]
    HeroNode [no=3, name=吴1用, nickname=智1多星]
    HeroNode [no=4, name=林冲, nickname=豹子头]
    ------------
    HeroNode [no=1, name=宋江, nickname=及时雨]
    HeroNode [no=2, name=卢俊义, nickname=玉麒麟]
    HeroNode [no=3, name=吴1用, nickname=智1多星]

  • 相关阅读:
    【BZOJ 4581】【Usaco2016 Open】Field Reduction
    【BZOJ 4582】【Usaco2016 Open】Diamond Collector
    【BZOJ 4580】【Usaco2016 Open】248
    【BZOJ 3754】Tree之最小方差树
    【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版
    【51Nod 1622】【算法马拉松 19C】集合对
    【51Nod 1616】【算法马拉松 19B】最小集合
    【51Nod 1674】【算法马拉松 19A】区间的价值 V2
    【BZOJ 2541】【Vijos 1366】【CTSC 2000】冰原探险
    【BZOJ 1065】【Vijos 1826】【NOI 2008】奥运物流
  • 原文地址:https://www.cnblogs.com/cai170221/p/13406766.html
Copyright © 2011-2022 走看看