线性表

线性表定义

线性表为零个或多个数据元素的有限序列。
序列表示元素之间是有顺序的,若存在多个元素,则第一个元素无前驱,最后一个元素无后继。其余每个元素都有且只有一个前驱和后继。

线性表的抽象数据类型

  • 初始化,创建一个空的线性表
  • 将表置空
  • 判断表是否为空
  • 获取线性表0元素个数
  • 获取一个元素
  • 添加一个元素
  • 删除一个元素
  • 查找一个元素

顺序存储结构

线性表的顺序存储结构,指的是用一段地址连续的存储单元依此存储线性表的数据元素。
使用数组即可实现顺序存储结构。

{
        int MAX_SIZE; // array max size
        T[] arrayData; // array data
        int length; // array length
    }

数据长度与数组长度的区别:
数组长度的存放线性表的存储空间的长度,存储分配后一般是不会发生变化的。
线性表长度是线性表中实际的元素个数,随着元素的插入和删除,长度是不断变化的。

int[] arrayInt = new Int[3];
arrayInt[0] = 1; 
arrayInt[1] = 2;
// array length is three,data size is two

内存地址计算:
存储器中每个存储单元都有自己的编号,这个编号即为内存地址。
由于数组分配一块地址连续的内存地址,所以只要知道第一个储存单元地址,就可以推算出其它储存单元地址。
因此顺序表读取一个元素的时间复杂度为O(1)。

查询插入删除操作:
对于线性表的顺序存储来说,获取第i个元素非常简单,只要不超过数组下标,直接返回数组i-1下标值即可。
在第i个位置插入数据时,如果i-1下标有值时,则i-1 下标及之后的值都需要后移一位。
在第i个位置删除数据时,如果i-1下标之后有值,则应该前移一位。

顺序存储的优点:

  • 无须为表示表中元素之间的逻辑关系而增加额外的存储空间
  • 可以获取表中任一元素
    顺序存储的缺点:
  • 插入删除时,涉及大量元素的移位
  • 长度不可改变
  • 造成存储空间的碎片

链式存储结构

线性表的链式存储结构是用一组任意的存储单元存储线性表的数据元素,这组数据单元可以是连续的,也可以是不连续的。
为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对于ai来说,除了存储其本身信息之外,
还需存储一个指示其直接后继的信息。我们将保存存储元素数据信息的域称之为数据域,把存储直接后继位置的称为指针域
指针域中存储的信息称做指针或链。这两部分域组成数据元素ai的存储映像,称为结点。

n个结点链接成一个链表,即为线性表(a1,a2,a3,a4...)的链式存储结构。
由于每个结点只包含一个指针域,也叫做单链表。

单链表的实现为:

class Node<E> {
        E item;
        Node<E> next;

        Node(E element, Node<E> next) {
            this.item = element;
            this.next = next;
        }
    }

查询插入删除操作:

  • 查询第i个元素,需要遍历整个链表,时间复杂度为O(N)
  • 插入和删除元素时,无须移动元素,仅改变指针域即可

链式结构的优点:

  • 插入删除时无需移动元素,时间复杂度为O(1)
  • 无须分配额定存储空间,不会造成空间浪费,也没有容量限制

链式结构的缺点:

  • 查找元素时需要遍历链表,时间复杂度为O(n)
  • 需要使用额外内存来保存指针信息

双向链表:
双向链表即 在单链表的每个结点中,再设置一个指向其前驱结点的指针域。

 class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }
posted @   cd_along  阅读(156)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示