Java数据结构-单向链表实现

链表是有序的,这是内存空间示意图

  1. 链表是以节点的方式来存储
  2. 每个节点包含data域next域:指向下一个结点
  3. 链表的各个元素不一定是连续存储
  4. 链表分为有头节点没有头节点的链表
  5. 链表循环时:temp = temp.next;
  6. 删除和插入元素时:都要找到待插入位置的前一个元素
package LinkedList;

public class SingleLinkedList {
    public static void main(String[] args) {
        //创建链表类
        SingleLinked singleLinked = new SingleLinked();
        //创建不可动的头节点
        Hero hero1 = new Hero(1,"宋江","及时雨");
        Hero hero2 = new Hero(2,"卢俊义","玉麒麟");
        Hero hero3 = new Hero(3,"吴用","智多星");
        Hero hero4 = new Hero(4,"林冲","豹子头");
        //添加数据
        singleLinked.addLinkedList(hero1);
        singleLinked.addLinkedList(hero4);
        singleLinked.addLinkedList(hero2);
        singleLinked.addLinkedList(hero3);

        //展示数据
        singleLinked.showLinked(singleLinked);
        //删除节点
        singleLinked.del(2);
        //展示数据
        System.out.println("链表删除后~~~");
        singleLinked.showLinked(singleLinked);
        //更新数据
        hero1.name = "胖头鱼";
        hero1.nickName = "大胖头鱼";
        singleLinked.updata(hero1);
        //展示数据
        System.out.println("更改信息后的数据");
        singleLinked.showLinked(singleLinked);
    }

}
class SingleLinked{
    //创建头节点
    private Hero head = new Hero(0,"","");
    //有序添加数据
    public void addLinkedList(Hero hero){
        //接收头节点
        Hero temp = head;
        //定义标识符
        boolean s =false;
        //遍历链表,找到链表的尾部
        while (true){
            if(temp.next==null){//若没有数据,则直接插入
                s = true;
                break;
            }
            if(temp.no < hero.no && temp.next.no > hero.no){//若满足条件,则退出循环
                s =true;
                break;
            }
            //未找到满足条件的式子,继续循环
            temp=temp.next;
        }
        //判断标识符
        if(s){
            hero.next = temp.next;//让新节点指向temp.next
            temp.next = hero;//让temp节点指向新节点
        }

    }

    public void showLinked(SingleLinked singleLinked){//展示数据
        //接收头节点
        Hero temp =head.next;
        //遍历链表
        while (true){
            if(head.next==null){//判断head指针域是否为空
                System.out.println("链表为空");
            }
            if(temp == null){//判断是否查询到底
                break;
            }
            System.out.println(temp);
            temp = temp.next;//继续循环
        }

    }

    public void del(int no){//删除节点
        //接收头节点
        Hero temp = head;
        //循环链表
        while (true){
            if(temp.next == null){//判断指针与有没有数据
                System.out.println("链表为空");
                break;
            }
            if(temp.next.no == no){//寻找指定排名的数据
                temp.next = temp.next.next;//讲前一个节点与后一个几点相连
                break;
            }
            temp = temp.next;//继续循环
        }
    }

    public void updata(Hero hero){//更改信息
        //接受头节点
        Hero temp = head;
        //循环遍历链表
        while (true){
            if(temp.no == hero.no){
                //更改信息
                temp.name=hero.name;
                temp.nickName=hero.nickName;
                break;
            }
            temp = temp.next;
        }
    }
}
class Hero{
    public int no;//排名
    public String name;//姓名
    public String nickName;//昵称
    public Hero next;//指针域

    public Hero(int no, String name, String nickName) {//构造方法
        this.no = no;
        this.name = name;
        this.nickName = nickName;
    }

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

学完老韩数据结构总结的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值