数据结构(Java语言描述)---------单链表

线性表的链式存储结构——链表

        线性表的链式存储结构称为线性链表,简称链表。常见的链表有单链表、循环链表和双向链表。链表的优点是数据的插入或删除都非常方便,不需要移动大量数据;缺点是设计数据结构时稍显麻烦,并且在查找数据时,无法像顺序表那样可随机读取,必须按顺序找到该数据为止。
        链表是用一组任意的存储单元(可以是连续的,也可以是不连续的存储单元)来存储线性表中的数据元素,逻辑上相邻的数据元素在物理位置上不一定相邻,因此,必须采用附加信息表示数据元素之间的逻辑关系。存储一个数据元素的存储单元称为结点(Node),一个结点至少包含两个部分:
                结点(数据域,地址域)
        其中,数据域存储数据元素本身,地址域(也称为引用域、指针域、链)存储前驱或后继结点的地址。地址域确定了数据元素之间的逻辑关系。


2.3.1单链表的结构

        1.单链表的定义
        每个结点只有一个地址域的线性链表称为单链表(Singly Linked List),结点结构如下:
                单链表结点(数据域data,后继结点地址域next)
       单链表有带头结点和不带头结点两种。图2-4所示为带头结点的单链表,指向单链表的指针 head称为头指针,头指针所指向的不存放数据元素的第一个结点称为头结点,存放第一个数据元素a。的结点称为开始结点,存放最后一个数据元素a_的结点称为尾结点。

1. 1单链表结点类 
 
public class Students {
    String name;
    int id;
    int score;
    public Students next;
 
    public Students(String name, int id, int score) {
        this.name = name;
        this.id = id;
        this.score = score;
 
    }
 
    public String getName() {
        return name;
    }
 
    public int getNumber() {
        return id;
    }
 
    public int getScore() {
        return score;
    }
 
    public Students getNext() {
        return next;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public void setNumber(int number) {
        this.id = number;
    }
 
    public void setScore(int score) {
        this.score = score;
    }
 
    public void setNext(Students next) {
        this.next = next;
    }
 
    @Override
    public String toString() {
        return "Students{" +
                "name='" + name + '\'' +
                ", number=" + id +
                ", score=" + score ;
    }
}
1.2方法实现        
 
public class StudentsList {
    Students head = new Students("", 0, 0);
 
    public Students getHead() {
        return head;
    }
 
    //添加,在链表的尾部添加元素
    public void add(Students s) {
        Students temp = head;
        while (true) {
            if (temp.next == null) {
                break;
            }
            temp = temp.next;
        }
        //Students newnode = new Students(s.name,s.id,s.score);
        temp.next = s;
 
    }
 
    //遍历
    public void list() {
        if (head.next == null) {
            System.out.println("链表为空");
        }
        Students temp = head;
        while (true) {
            if (temp.next == null) {
                break;
            }
            temp = temp.next;
            System.out.println(temp);
        }
    }
 
    //删除
    public void remove(int i) {
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        Students temp = head;
        boolean flag = false;
        while (true) {
            if (temp.next == null) {
                break;
            }
            if (temp.next.id == i) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            temp.next = temp.next.next;
        } else {
            System.out.println("元素不存在");
        }
    }
}
1.3实现代码
public class Demo {
    public static void main(String[] args) {
        Students s1 = new Students("meiko",1,80);
        Students s2 = new Students("marry",2,90);
        Students s3 = new Students("jack",3,92);
        Students s4 = new Students("aa",4,80);
        Students s5 = new Students("bb",5,99);
        Students s6 = new Students("cc",6,100);
        //表1
        StudentsList list1 = new StudentsList();
        list1.add(s1);
        list1.add(s2);
        list1.add(s3);
        System.out.println("表1:");
        list1.list();
        //表2
        StudentsList list2 = new StudentsList();
        list2.add(s4);
        list2.add(s5);
        list2.add(s6);
        System.out.println("表2:");
        list2.list();
        //删除
        System.out.println("删除表1学号为2的学生");
        list1.remove(2);
        list1.list();
        
        //合并
        System.out.println("合并");
        StudentsList list3 = new StudentsList();
        list3.merge(list1,list2,list3);
        list3.list();
}
4.一些方法其它算法
(1)求表长、清空、判断表空
public int size(){
    int n = 0;
    
    Students temp  = head.next;
    While(temp!null){
        temp++;
        temp=temp.next;
    }
    return n;
}
(2) 清空单链表 

public void clear(){
    head.next = null;
    //清空单链表
}
太多了太多了 不一一总结了 总结主要的就好了
————————————————
版权声明:本文为CSDN博主「xiexieya233」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiexieya233/article/details/124111684

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值