Algorithm Notes (六)Linear List

来源:互联网 发布:应届生程序员面试题 编辑:程序博客网 时间:2024/06/05 05:25

线性表的理解?

     线性表从字面上的理解是线性的表示结构,生活中有很多类似于线性的例子,比如人们在买东西或等其它事情的时候经常排成一个线性结构,可以是直线也可以是曲线,线性表从字面上面的意思理解为成一条直线的表,对于程序设计人我们最熟悉的莫过于关系型数据库如mysql等,它里面也有表的概念,我们可以对比着来理解线性表。

定义

     零个或多个元素的有限序列。

     从定义中可以知道线性表具有有限个元素,元素个数可知的元素组成,并且元素之间的关系符合线性,如两个元素之间具有先后顺序,除了第一个和最后一个元素,每个元素前后都有衔接元素,叫做直接前驱和直接后继。第一个元素没有前驱,最后一个元素没有后续。可以参考下面表格来理解线性表结构:

数据 数据库 数据对象 表 数据元素 行 数据项 字段

理解误区:

     线性表的每个数据元素只保存了一个数据,其实它每个数据元素还可以分为多个数据项,同上面的对标,一个数据元素可以理解为数据库表中一条记录,每个数据元素还有很多数据项组成,如学生信息,包含学号、姓名、性别、出生年月等

存储结构

顺序存储

指用一段连续的存储单元来依次存储线性表的数据元素。

如下面所示,用数学符号来表示元素的线性关系

这里写图片描述

     由于顺序存储结构是连续的很显然我们可以通过数组来存储,它里面保存的数据类型相同,我们只要知道了数组元素的起始地址即可以通过内容地址计算方法算出每一个后面元素的地址,因此在访问数组中各个元素时时间复杂度都是O(1),即在常数范围内。
- 读取

     知道了第一个元素位置,可以容易计算出来每个数据元素地址,因此时间复杂度为O(1),如下图

这里写图片描述

  • 插入、删除
         对于顺序存储结构来说,如果想要插入或者删除一个元素时,首先需要找到该元素复杂度为O(1),插入或删除完成后,后面的节点需要依次往前移动一个单位,最坏的情况插入或者删除首个字符,那么需要移动n-1次才能完成操作,即复杂度为O(1).
    如下图所示:

这里写图片描述

链式存储

     每个节点在计算机磁盘上不一定连续,由数据域和指针域组成,指针指向下一个节点信息,链式存储结构用起来比较灵活。

这里写图片描述

  • 查找

     从定义中可以知道链式存储只有上一个节点才知道下一个节点在哪里,如果想要查找某个节点数据,必须从上一个节点开始,依次往上推,也就是说需要从第一个节点开始搜索,知道找到我们要查找的节点,复杂度最坏为n,即最后一个元素。

  • 插入、删除
         

     链表在执行插入和删除操作时,首先第一步也是找到需要删除或者插入节点的位置,该查找过程为O(i);当找到要删除元素位置时,只需要进行指针变化就可以完成。

     观察这个过程查找、插入、删除都是先查找,如果只操作一个节点效率和顺序存储是一样的,好处在于找到插入节点位置后进行频繁插入、删除操作后面的复杂度就都是O(1),从链式存储结构的特性来看可以看出它适合进行频繁插入操作,插入多个元素等情况,在进行插入删除多的数据里面使用链表来存储数据会显著提高效率。

链表几种形式
- 单链表

     单链表即我们上面提到的这种形式,每个节点都有一个指向下一个节点的指针,只可以从前面找到后面的数据,而没有办法从后往前找元素,如果想从最后一个节点访问第一个节点是访问不到的,基于这种弊端,出现了循环链表。
- 循环链表

     把单链表的最后一个节点指针指向首节点,链表的各个元素就互相连接了起来组成了一个环形结构,我们把它定义为循环链表,循环解决了从末尾访问前端元素的问题,那么如果我想从一个元素访问它的前面的元素,怎么访问如果通过循环转一圈那么复杂度为O(N-1),为了进一步提高效率又出现了双向链表。

这里写图片描述

  • 双向链表

     在每个节点中又增加了一个指向直接前驱的指针域,用来保存前一个节点的访问地址,这样可以从任何一个节点访问它的前后节点,增加了链表的操作方便灵活性。

这里写图片描述

总结

     本小节内容不多可以通过下面一张图来代表,对于线性表结构在物理上面是这么存储的,下篇让我们来分析一下java里面ArrayList和LinkedList是如何来实现这一线性表特性的,敬请期待。

这里写图片描述

问题

头指针和头结点的异同?

     头指针比较好理解,指向第一个节点的指针叫做头指针,它就好比数组中的首地址一样具有标识数组的作用,它是必须存在的指针。
头结点是我们为了统一方式操作链表中各个节点而设置的一个特殊节点,当头结点存在的时候,头节点的数据域可以存储链表长度等信息,它的指针叫做头指针,但是地址指向第一个节点。

原创粉丝点击