什么是线性表?
线性表是由n个相同类型的数据元素组成的有限序列,它是最基本的一种线性结构。顾名思义,线性表就像是一条线,不会分叉。线性表有唯一的开始和结束,除了第一个元素外,每个元素都有唯一的直接前驱,除了最后一个元素外,每个元素都有唯一的直接后继。线性表有两种存储方式,分别是顺序存储和链式存储。采用顺序存储的线性表称为顺序表,采用链式存储的线性表称为链表。链表又分为单链表、双向链表和循环链表。顺序表:顺序表采用顺序存储方式,元素存储是连续的,中间不允许有空,因此顺序表可以快速定位是第几个元素,但是插入和删除需要移动大量的元素。顺序表的基本操作:(1)取值:顺序表中的任何一个元素都可以立即找到,称为随机存取方式。例如,要取第i个元素,只要i值合理,可以找到该元素,由于下标是从0开始的,因此第i个元素,其下标为i-1。线性表取值的时间复杂度为O(1)。
(1)取值:顺序表中的任何一个元素都可以立即找到,称为随机存取方式。例如,要取第i个元素,只要i值合理,可以找到该元素,由于下标是从0开始的,因此第i个元素,其下标为i-1。线性表取值的时间复杂度为O(1)。
(2)查找:在顺序表中查找一个元素e,可以从第一个元素开始顺序查找,依次比较每一个元素值,如果相等,则返回元素位置(位序,即第几个元素),如果查找整个顺序表都没找到,则返回-1。线性表取值的时间复杂度为O(n)。
(3)插入:在顺序表中第i个位置之前插入一个元素e,需要从最后一个元素开始,后移一位,…,直到把第i个元素也后移一位,然后把e放入第i个位置。线性表取值的时间复杂度为O(n)。
(4)删除:在顺序表中删除第i个元素,需要把该元素暂存到变量e,然后从i+1个元素开始前移,…,直到把第n个元素也前移一位,即可完成删除操作。线性表取值的时间复杂度为O(n)。
顺序表的优点:操作简单,存储密度高,可以随机存取,只需要O(1)的时间就可以取出第i个元素。
顺序表的缺点:需要预先分配最大空间,最大空间估计过大或过小会造成空间浪费或者溢出。插入和删除操作需要移动大量的元素。在实际问题中,如果经常需要插入和删除操作,则顺序表的效率很低。为了克服该缺点,可以采取链式存储。我们首先来看看最简单的单链表。单链表:可以给每个元素附加一个指针域(或者数组),指向下一个元素的存储位置。如下图所示,每个节点包含两个域,数据域和指针域。数据域存储数据元素,指针域存储下一个节点的地址。每个指针都指向下一个节点,都是朝着一个方向的,这样的链表称为单链表。
单链表:可以给每个元素附加一个指针域(或者数组),指向下一个元素的存储位置。如下图所示,每个节点包含两个域,数据域和指针域。数据域存储数据元素,指针域存储下一个节点的地址。每个指针都指向下一个节点,都是朝着一个方向的,这样的链表称为单链表。
取值:单链表的取值不像顺序表那样可以随机访问任何一个元素,必须从第一个结点开始按顺序向后找,一直找到第i个结点。单链表取值的时间复杂度为O(n)。
删除:删除一个结点,实际上是把这个结点跳过去。根据单向链表向后操作的特性,要想跳过第i个结点,就必须先找到第i-1个结点。单链表插入的时间复杂度为O(1)。