【java数据结构】线性表(顺序表及链表)及其实现

本文介绍了线性表的概念,包括抽象数据类型概述和两种存储实现方式:顺序存储(数组)和链式存储(单链表、双向链表、环形链表)。详细讲解了链表的操作,如添加、遍历、修改和删除结点,并讨论了约瑟夫环问题的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

01 引入: 多项式的表示

 02 什么是线性表

2.1 线性表抽象数据类型概述

2.2 线性表顺序存储实现

2.3 线性表的链表存储实现

2.3.1 单链表实现 

2.3.2 双向链表实现代码

2.3.3单向环形链表和约瑟夫环

01 引入: 多项式的表示

 方法一:顺序结构直接表示(数组)

 方法二:顺序存储结构存储非零项

 方法三: 链表结构存储非零项

 02 什么是线性表

线性表”:由同类型数据元素构成有序序列的线性结构

  • 表中元素个数称为线性表的长度
  • 线性表没有元素时,称为空表
  • 表起始位置称为表头,表结束位置称表尾

 说明:线性表也就是数组的一种特殊储存方式:从头到尾依次储存数据。

 2.1 线性表抽象数据类型概述

线性表操作接口描述 

 public interface IList {  
        public void clear(); // 将一个已经存在的线性表置成空表  
      
        public boolean isEmpty(); // 判断当前线性表中的数据元素个数是否为0,若为0则函数返回true,否则返回false  
      
        public int length(); // 求线性表中的数据元素个数并由函数返回其值  
      
        public Object get(int i) throws Exception;// 读取到线性表中的第i个数据元素并由函数返回其值。其中i取值范围为:0≤i≤length()-1,如果i值不在此范围则抛出异常  
      
        public void insert(int i, Object x) throws Exception;// 在线性表的第i个数据元素之前插入一个值为x的数据元素。其中i取值范围为:0≤i≤length()。如果i值不在此范围则抛出异常,当i=0时表示在表头插入一个数据元素x,当i=length()时表示在表尾插入一个数据元素x  
      
        public void remove(int i) throws Exception;// 将线性表中第i个数据元素删除。其中i取值范围为:0≤i≤length()- 1,如果i值不在此范围则抛出异常  
      
        public int indexOf(Object x);// 返回线性表中首次出现指定元素的索引,如果列表不包含此元素,则返回 -1  
          
        public void display();// 输出线性表中的数据元素  
      
    }  

2.2 线性表顺序存储实现

利用数组的连续存储空间顺序存放线性表的各元素

注:顺序存储中是序号是下标,从 0 开始 

public class SeqList implements List{
    private Object[] listArray;  // 初始化线性表存储空间
    private int size;  //数组当前长度
    private int maxSize; // 数组允许的最大长度

    public SeqList(int maxSize) { //初始化
        this.size = 0;
        this.maxSize = maxSize;
        listArray = new Object[maxSize];
    }

    @Override
    public void clear() {
        size = 0;  // 置当前长度为0

    }

    @Override
    public boolean isEmpty() {
        return size == 0;  // 判断当前长度是否为0,是则返回true
    }

    @Override
    public int length() {
        return size;   // 返回数组当前长度
    }

    @Override
    public Object get(int i) throws Exception {
        if(i < 0 || i >= size){
            throw new Exception("第" + i + "个元素不存在");
        }else{
            return listArray[i];
        }
    }

    @Override
    //在线性表的第i个数据元素之前插入一个值为x的数据元素。其中i取值范围为:0≤i≤length()。
    // 如果i值不在此范围则抛出异常,当i=0时表示在表头插入一个数据元素x,当i=length()时表示在表尾插入一个数据元素x
    public void insert(int i, Object x) throws Exception {
        if(size == maxSize){  // 判断表已满
            throw new Exception("顺序表已满");
        }
        if (i < 0 || i > size){ //这里不能是maxSize 因为线性表必须连续
            throw new Exception("插入位置错误");
        }
        // 插入位置正确,索引为 i-(size-1)数据后移
        for(int j = size-1 ; j >= i ; j--){
            listArray[j + 1] = listArray[j];
        }
        listArray[i] = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值