单向链表的添加、遍历、修改与删除java

举一个例子:
我们小时候玩儿的积木拼接,它是前凸后凹的,能进行很好的连接。 某一天晚上,爸爸买回来一盒积木,并且这些积木都是一样的,想要搭建好这些积木,我就需要进行拼接!

package Demo7;

import Demo6.SingleLinkedList;

public class Demo {
    public static void main(String[] args) {
        //先添加数据
        Hero h1 = new Hero(0,"张三");
        Hero h2 = new Hero(1,"李四");
        Hero h3 = new Hero(2,"王五");
        Hero h4 = new Hero(4,"c");
        Hero h5 = new Hero(3,"cc");
        //创建一个对象去管理,将上述数据进行整合
        StringleLinked s = new StringleLinked();
        s.addby(h1);
        s.addby(h2);
        s.addby(h3);
        s.addby(h5);
        s.addby(h4);
      ;
        //打印出链表中的数据
        s.print();

        //修改操作
        Hero h6 = new Hero(1,"李晖");
        s.update(h6);
        s.print();
        //删除
        s.delete(2);
        s.print();
    }
}

package Demo7;

public class Hero { // 积木
    int no ;
    String name;
    Hero next;		//积木的凹回去的地方
    //构造方法
    public Hero(){}
    public Hero(int no, String name) {
        this.no = no;
        this.name = name;
    }

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

package Demo7;

import Demo6.HeroNode;

import java.util.Objects;

public class StringleLinked {
    //初始化一个单项链表对象用于表示头结点
    Hero head = new Hero(0,"");
    //该怎么将他们变成一个连一个呢?
    //他们都用next表示,咱们也用一下

    // 先将他们一个个添加一下
    public void add(Hero hero){
        //先创建一个temp表示头结点,避免头结点指针随着添加发生改变
        Hero temp = head; //头结点里面只有一个next,就没有数据
        //添加 肯定是要到末尾进行添加,所以先循环遍历结点,找到最后一个结点
        while(true){
            //如果一开始一个数据都没有,光有一个头结点,那肯定是要在头结点后面添加数据咯!
            if(temp.next==null){
                temp.next = hero;       //  找到末尾后,进行添加数据索引地址
                break ;
            }
            //此时还在循环中,通过改变循环条件,继续循环
            temp = temp.next;
        }
    }

    //插入操作,根据编号的大小来进行添加;
    public  void addby(Hero hero){
        //首先要找位置,才能进行添加,位置需要循环遍历才能得到,不能改变头指针
        Hero temp = head;
        boolean flag = false;  //判断是否重复
        while (true){
            if(temp.next==null){    //在temp后面的位置进行添加
                break;
            }
            if(temp.next.no>hero.no){
                break;
            }else if(temp.next.no== hero.no){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if(flag){       //if里面的flag 为true
            System.out.println("重复存入编号为:"+hero.no+"请检查!");

        }else{          //为flag
            hero.next = temp.next;
            temp.next = hero;
        }


    }

    //根据编号进行修改
    public void update(Hero hero){
        //先判断链表为不为空
        if (head.next==null){
            System.out.println("此链表为空!");
            return;
        }
        //设置一个temp,用来循环链表
        //用flag来判断,是否能找到这个编号
        Hero temp = head;
        boolean flag = false;
        while (true){
            if(temp.next == null){
                break;
            }
            if(temp.next.no == hero.no){
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag){
            //说明找到相同的编号好了,进行修改
            temp.next.name = hero.name;
            return;
        }else{
            System.out.println("根据编号并没有找到此编号!");
        }
    }
    //删除节点
    public  void  delete(int no){
        //先判断链表是否为空
        if (head.next==null){
            System.out.println("此链表为空");
            return;
        }
        //接下来是,遍历链表,查找数据
        Hero temp = head;
        boolean flag = false;
        while(true){
            if(temp.next == null){
                break;
            }
            if(temp.next.no == no){
                break;
            }
            temp = temp.next;
        }
        if(flag){
            System.out.println("没找这个节点!");
        }else{
            temp.next = temp.next.next;
        }
    }
    
    //将链表中的数据一个一个的显示出来
    public void print(){
        //先判断是否有数据
        if(head.next==null){
            System.out.println("空链表");
            return;
        }
        //循环将一个个数据拿出来,当然还是不能改变头结点的next
        Hero temp = head;
        //while循环遍历,将数据取出来
        while(true){
            if(temp.next==null){
                return;
            }
            System.out.println(temp.next);
            temp = temp.next; //改变循环条件
        }

    }
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值