首页 > 其他分享 >1、线性表

1、线性表

时间:2022-12-06 22:36:52浏览次数:39  
标签:index 元素 线性表 elementData param public size

线性表是有限个相同元素有顺序地排列的集合。

实现方式通常分为顺序表实现和链表实现。


 

1、顺序表(数组)实现线性表

直接分配一块连续的内存存储数据。比如数组,就是一个天然的顺序表。

优点:

  是空间利用率高,通过索引查找元素快。

缺点:

  不确定需要存储的元素个数,可能会浪费空间,插入元素,删除元素效率不高(除了在结尾操作)。

例子:

import java.util.Arrays;

/**
 * 顺序表实现线性表结构
 * @author lurenjia
 * @date 2022/12/6-16:08
 */
public class Mylist {
    //储存数据的数组
    private Object[] elementData;
    //元素个数
    private int size;

    /**
     * 无参构造,创建一个大小为4的数组
     */
    public Mylist() {
        elementData = new Object[4];
    }

    /**
     * 指定位置插入元素
     * @param index 索引
     * @param o 元素
     */
    public void add(int index,Object o){
        if(size==elementData.length){
            //元素个数等于数组长度时,扩容为原数组长的1.5倍
            elementData = Arrays.copyOf(elementData,elementData.length+(elementData.length>>1));
        }
        if(size!=0) {
            //1、第index个元素之后的元素都往后移一位
            System.arraycopy(elementData,
                    index,
                    elementData,
                    index + 1,
                    size - index);
            //2、改变第index个元素的值
            elementData[index] = o;
        }else {
            elementData[index]=o;
        }
        size++;
    }

    /**
     * 加入元素在最后
     * @param o 元素
     */
    public void add(Object o){
        add(size,o);
    }

    /**
     * 通过索引获得元素
     * @param index 索引
     * @return 元素
     */
    public Object get(int index){
        return elementData[index];
    }

    /**
     * 在容器中查找指定的元素,若存在则返回它第一次出现的位置,若不存在返回-1.
     * @param o 要查找的元素
     * @return 位置或-1
     */
    public int contains(Object o){
        for(int i=0;i<elementData.length;i++){
            if(elementData[i]==o){
                return i;
            }
        }
        return -1;
    }
    /**
     * 获取容器大小
     * @return 容器大小
     */
    public int size() {
        return size;
    }

    @Override
    public String toString() {
        return "Mylist{" +
                "elementData=" + Arrays.toString(elementData) +
                ", size=" + size +
                '}';
    }
}

 

2、单链表实现线性表

节点中分为两个空间,一个存放数据,一个存放下一个节点的地址。

优点:

  插入元素,删除元素效率高,不会有空闲的空间。

缺点:

  查找元素效率低。

例子:

package lurenjia.test;

/**
 * 单链表实现线性表结构
 * @author lurenjia
 * @date 2022/12/6-16:24
 */
public class MyLink {
    //头节点,不放内容
    private MyNode first = new MyNode();
    //容器大小
    private int size;


    /**
     * 在指定的位置插入元素
     * @param i 位置
     * @param obj 插入的元素
     */
    public void add(int i,Object obj){
        //1、获取前驱
        MyNode temp = getNode(i);
        //2、创建新节点
        MyNode newNode = new MyNode();
        newNode.setData(obj);
        //3、新节点的后继指向前驱的后继
        newNode.setNextNode(temp.getNextNode());
        //4、前驱的后继指向新节点
        temp.setNextNode(newNode);
        size++;
    }

    /**
     * 在结尾加入元素
     * @param obj 元素
     */
    public void add(Object obj){
        add(size,obj);
    }

    /**
     * 通过索引获取元素
     * @param index
     * @return
     */
    public Object get(int index){
        MyNode tempNode = getNode(index);
        return tempNode.getData();
    }

    /**
     * 通过索引获取节点
     * @param index
     * @return
     */
    private MyNode getNode(int index){
        if(index>size){
            throw new RuntimeException("索引越界"+index);
        }else {
            //1.获取头节点
            MyNode tempNode = first;
            for(int i =0;i<index;i++){
                //2.循环找到目标节点
                tempNode=tempNode.getNextNode();
            }
            return tempNode;
        }
    }

    /**
     * 获取容器大小
     * @return
     */
    public int size() {
        return size;
    }
}

 

标签:index,元素,线性表,elementData,param,public,size
From: https://www.cnblogs.com/lurenjia-bky/p/16961544.html

相关文章

  • 算法刷题入门线性表|单调栈
     一、概念1、栈的定义栈 是仅限在 一端 进行 插入 和 删除 的 线性表。 栈 又被称为后进先出(LastInFirstOut)的线性表,简称LIFO。2、栈顶栈 是一......
  • 【以练促学:数据结构】2.线性表
    (持续刷题,持续更新...)1.顺序表与链表的比较:(空间性能)顺序表链表 逻辑相邻,物理存储位置相邻逻辑相邻,物理存储位置未必相邻存储空间分配·必须预先分配不用......
  • 数据结构1-概念和线性表
    Note1:概念介绍1.1数据结构在学什么?1.2算法的基本概念 1.3时间复杂度 1.4 空间复杂度 Note2:线性表2.1线性表的定义和基本操作(包括顺序表和链表)......
  • [NEFU 数据结构] 第 2 章 线性表 知识点整理
    [NEFU数据结构]第2章线性表知识点整理阅读须知需求指向:此博客用于应付NEFU数据结构考试,基于题目进行整理,不适合想深入学习数据结构与算法艺术的同学。前置知识:C语言......
  • p1.线性表
    LinearList线性表线性表的顺序表示线性表的链式表示1.线性表由n(n>=0)个相同类型元素组成的有序集合 L=(a1,a2,...,ai)线性表中元素的个数称为线性表的长度-......
  • 【线性表】之顺序表(C语言)
    【线性表】之顺序表​​线性表​​​​顺序表​​​​结构定义​​​​初始化​​​​销毁​​​​打印​​​​扩展空间​​​​尾插​​​​头插​​​​尾删​​​​头删......
  • 【线性表】之栈(C语言)
    栈​​回顾​​​​栈​​​​结构定义​​​​初始化​​​​销毁​​​​入栈​​​​出栈​​​​返回栈顶元素​​​​返回栈中元素个数​​​​判断栈是否为空​​​​......
  • 【线性表】之队列(C语言)
    队列​​队列的概念​​​​结构定义​​​​初始化​​​​销毁​​​​队尾入​​​​队头出​​​​队头出​​​​队头数据​​​​队尾数据​​​​是否为空​​​​返......
  • 《大话数据结构》线性表代码总结
    //线性表存储的结构代码#include<stdio.h>#include<stdlib.h>#include<time.h>#defineMAXSIZE1000//静态链表部分的#defineMAX_SIZE20//最大长度#defineOK1#defineER......
  • 时间序列数据挖掘之分段线性表示(PLR)
    前言本篇博客用于记录个人在时间序列数据挖掘中进行的timeseriesrepresentation的实践。主要采用PLR(piecewiselinearrepresentation)的方式进行时间序列的降......