zoukankan      html  css  js  c++  java
  • 线性表

    线性表是一种典型的线性结构。头结点无前驱有一个后继,尾结点无后继有一个前驱。链表只能顺序查找,定位一个元素的时间复杂度为O(N),删除一个元素的时间为O(1)。

    1. 线性表的顺序存储结构:把线性表的结点按照逻辑顺序依次存放在一组地址连续的存储单元里。用这种方法存储的线性表称为顺序表,是一种随机存取的存储结构。顺序存储结构指的是内存地址是连续的,随机存取指的是访问时可以按照下标随机访问,存储和存取是不一样的。如果是存储,是指按照顺序的;如果是存取,则是可以随机的,可以利用元素下标进行。数组比线性表速度更快是因为:原地逆序、返回中间节点、选择随机节点。

      • 便于线性表的构造和任意元素的访问。
      • 插入:插入新结点时,之后的结点后移,平均时间复杂度为O(n)。
      • 删除:删除结点,之后的结点前移,平均时间复杂度为O(n)。
    2. 线性链表:用一组任意的存储单元来依次存放线性表的结点,这组存储单元可以是连续的,也可以是不连续的,甚至可以是零散分布在内存中的任意位置上。因此,链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址。data是数据域,用来存放结点的值。next是指针域,也称为链域,用来存放结点的直接后继的地址。而链表也不需要事先估计存储空间的大小。

      • 单链表:每个结点的存储地址是存放在其前驱结点next域中,而开始结点无前驱,故应该设置头指针head指向开始的结点。同时,由于最后一个结点无后继,故最后一个结点的指针域为空,即NULL。投头插法建表逆序,尾插法建表顺序。增加头结点的目的是算法实现上的方便,但是增加了内存开销。

        • 查找:只能从链表的头指针出发,顺指针域next逐个结点往下搜索,直到搜索到第i个结点位置。因此,链表不是随机存取的结构
        • 插入:先找到表的第i-1的存储位置,然后插入,新结点先连后继,再连前驱。
        • 删除:首先找到ai-1的存储位置p,然后令p->next指向ai的直接后继结点,即把ai从链表下摘掉,最后释放结点ai的空间:r=p->next;p->next=r->next;delete r。
        • 判断一个单项链表中是否有环的最佳方法是快慢指针
      • 静态链表:用一维数组来实现线性链表,这种用一维数组表示的线性链表,即成为静态链表。静态体现在表的容量是一定的,即数组的大小;链表是指插入与删除元素同前面所述的动态链表的方法相同。静态链表中指针表示的是下一个元素在数组中的位置。

      • 静态链表是用数组实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配大小。动态链表是用申请内存函数动态申请内存的,所以在链表长度上没有限制。动态链表因为是动态申请内存,所以每个结点的物理地址不连续,需要通过指针来顺序访问。静态链表在插入和删除时也是通过修改指针域来实现的,与动态链表没有什么分别。

      • 循环链表:是一种头尾相接的链表,其特点是无须增加存储量,仅对表的连接方式稍作改变,即可使得表处理更加方便灵活。

        • 在单链表中,将终端结点的指针域NULL改为指向表头结点或开始结点,就得到了单链表形式的循环链表,并简单成为单循环链表。由于循环链表中没有NULL指针,故设计遍历操作时,其终止条件就不再像非循环链表那样判断p或p->next是否为空,而是判断它们是否等于某一指定指针,如头指针或尾指针等。
      • 双向链表:在单链表的每个结点里再增加一个指向其直接前驱的指针域prior,这样形成的链表中有两个方向不同的链。双链表一般由头指针唯一确定的,将头结点和尾结点连接起来构成循环链表,并称之为双向链表。设指针p指向某一结点,则双向链表结构的对称性可用下式描述:p->prior->next=p=p->next->prior。从两个方向搜索双链表,比从一个方向搜索双链表的方差要小。

        • 插入:先找到插入结点的前驱和后继,再找到后结点的前驱,最后搞定前结点的后继。
        • 在有序的双向链表中定位删除一个元素的平均时间复杂度为O(n)。
        • 可以直接删除当前指针所指向的结点,而不需要像单向链表中,删除一个元素必须找到其前驱,因此在插入数据时,单向链表和双向链表操作复杂度相同,但删除数据时,双向链表的性能优于单向链表。
    作者:凯旋.Lau
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    通过html()的方法获取文本内容, form表单组件显示的值与获取到的值不一致的问题
    quartz实例以及主要事项(注解)
    解决因为链表过长,sql查询慢的问题
    query flot 直方图上显示对应的y值
    git error: RPC failed; curl 18 transfer closed with outstanding read data remaining error: 7777 bytes of body are still expected
    iso七层模型及其功能作用
    计算机进制之间的转换,十进制转二进制换算
    libconfig++ 交叉编译流程
    Ubuntu 交叉编译( gcc-linaro-arm-linux-gnueabihf)环境搭建
    周立功IoT7000li编译移远EC20驱动记录
  • 原文地址:https://www.cnblogs.com/KX-Lau/p/12382531.html
Copyright © 2011-2022 走看看