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多星]

  • 相关阅读:
    类和对象基础
    《Python》常用内置模块
    《Python》内置方法进阶和常用模块
    《Python》反射、内置方法(__str__,__repr__)
    《Python》 property、classmethod、staticmethod、isinstance、issubclass
    《Python》 面向对象三大特性之多态、封装
    面向对象三大特性之继承
    面向对象初识(组合)
    面向对象之入门-《初识》
    前端基础之jQuery操作标签
  • 原文地址:https://www.cnblogs.com/cai170221/p/13406766.html
Copyright © 2011-2022 走看看