JAVA数据机构与算法(个人笔记)---线性表操作(单链表)

单链表的结构

单链表的定义

一个结点有两个部分,分别是:(数据域,地址域),其中,数据域也就是数据本身,地址域(也称为引用域、指针域、链),也就是它的下一个要去的元素

每个结点只有一个地址域的线性链表称为单链表

单链表定义:

一个头结点,还有next作为指针,也就是结点的地址域,存放后继结点的引用信息。

首先是头结点,以及单链表的一些操作

public class SinglyLinkedList {
    Student head = new Student(0, "0", 0);                  //创建头结点head,指针next在Student
    public Student getHead() {                                              //查询头结点
        return head;
    }
    public void add(Student s) {                                     //添加加元素

        Student t = head;                                             //设一个元素为头结点
        while (true) {
            if (t.next == null) {                                   //判断头结点的下一个元素(也就是指针)是不是空的,空的就退出循环
                break;
            }
            t = t.next;                                    //下一个上面的判断,下一个元素不为空,就等于下一个元素然后又回到上面继续判断
        }
        t.next = s;                                  //上面判断到下一个元素为空了之后,这里就把下一个元素等于s也就是测试类那边加入的元素
    }

    public void list() {                                             //查询
        if (head.next == null) {                                    //判断头结点的下一个数为不为空,空的话就不用往下看了
            System.out.println("空");
        }
        Student t = head.next;                                     //设一个元素等于链表的指针
        while (true) {
            if (t == null) {                                       //判断元素为不为空,为空结束
                break;
            }
            System.out.println(t);                             //输出元素
            t = t.next;                                        //因为上面没结束,所以肯定还有下一个元素,这里就等于下一个元素继续输出
        }
    }

    public void list(int i) {                                             //指定查询
        int j=0;
        Student t =head.next;                                   //等于头结点的下一个元素
        if (t.next == null) {
            System.out.println("空");
        }
        while (true) {
            if (j==i) {                                         //j来判断和输入的i相等了就输出
                System.out.println(t);
                break;
            }
            if (t.next==null){                                  //下一个元素为空了就退出
                break;
            }
            t = t.next;                                         //上面没结束就继续指向下一个元素
            j++;
        }

    }

    public void remove(int i) {                                        //删除
        int j = 0;
        Student p = head;
        while (p.next != null && j < i) {           //判断头结点的下一个元素不等于空或者j<i打到条件就结束循环,寻找要删除的结点的位置
            p = p.next;
            j++;
        }
        if (p.next != null && j == i) {           //找到后直接用结点的的指针指向下一个元素结点的指针,比如:1的一个元素是2,2的下一个元素是3
            p.next = p.next.next;                   //要删除2就直接把1的下一个元素指向3,那么就123就变成了13
        }

    }

    public void set(int i, Student t) {                        //修改
        int j = 0;
        if (head.next == null) {
            System.out.println("链表为空");
        }
        Student p = head.next;
        boolean flag = false;                                   //设一个布尔来判断代码下面会用到
        while (true) {
            if (p.next == null) {                     //判断下一个值是不是为空,因为不设长度,不判断的话i比长度还多的话就会一直循环
                break;
            }
            if (j == i) {                               //这里找到要修改的位置然后break退出循环
                flag = true;
                break;
            }
            p = p.next;
            j++;
        }
        if (flag) {
            p.no = t.no;                                    //这里修改元素为新元素里面的参数
            p.name = t.name;
            p.score = t.score;

        } else
            System.out.println("当前节点不存在,无法修改!");
    }

    public Student paixu(Student head) {                          //排序,排序可以自己带入参数思考一下
        if (head == null || head.next == null) {return head;}
        Student n1=head;
        Student n2=head.next;
        Student n3=new Student(0,"",0);
        n3.next=head;

        while (n2!=null){
            if(n2.score < n1.score){
                n1.next=n2.next;
                Student no1=n3;
                Student no2=n3.next;
                while (n2.score > no2.score){
                    no1=no2;
                    no2=no2.next;
                }
                no1.next=n2;
                n2.next=no2;
                n2=n1.next;
            }else {
                n1=n2;
                n2=n2.next;
            }
        }
        return n3.next;
    }
}






然后是指针next可以去顺序表那里Student类复制代码

接着就是测试类了

public class ceshi1 {
    public static void main(String[] args) {
        Student x1=new Student(1,"大娃",10);                      //添加数据
        Student x2=new Student(2,"二娃",40);
        Student x3=new Student(3,"三娃",70);
        Student x4=new Student(4,"四娃",91);
        Student x5=new Student(5,"五娃",94);
        Student x6=new Student(6,"六娃",97);

        SinglyLinkedList list1=new SinglyLinkedList();                            //创建单链表
        list1.add(x1);                                                            //添加单链表元素
        list1.add(x3);
        list1.add(x5);
        System.out.println("单链表1:");
        list1.list();                                                             //遍历单链表元素


        SinglyLinkedList list2=new SinglyLinkedList();
        list2.add(x2);
        list2.add(x4);
        list2.add(x6);
        System.out.println("单链表2:");
        list2.list();

        System.out.println("合并两个链表:");
        list2.add(list1.head.next);                                     //合并
        list2.list();
        System.out.println("排序链表:");
        list2.paixu(list2.head);                                        //按成绩从小到达排序
        list2.list();

        list1.remove(4);                                             //删
        System.out.println("删除第五个后");
        list1.list();

        System.out.println("查询第3个元素");                              //查
        list1.list(2);

        System.out.println("第三个元素修改为大娃");                         //改
        list1.set(2,x1);
        list1.list();
    }
}

测试结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

居士KJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值