线性表
线性表定义:线性表是具有相同特性数据元素的有限序列。
线性表的长度=数据元素的个数(n≥0)
线性结构(线性表)的特点:
1.集合中必存在唯一的一个“第一元素”。
2.集合中必存在唯一的一个 “最后元素” 。
3.除最后一个元素之外,均有唯一的后继(后件)。
4.除第一个元素之外,均有唯一的前驱(前件)。
线性表的ADT:访问、插入和删除
顺序表和链表的比较:
顺序表 | 链表 | |
---|---|---|
存储分配方式 | 一次性分配 | 多次分配 |
存储密度 | 1 | <1 |
存取方式 | 顺序存取、随机存取 | 只能从表头开始顺序存储 |
按值查找 | 无序:O(n);折半查找法:O(log2n) | O(n) |
按序号查找 | O(1) | O(n) |
插入操作 | 需要移动半个表长得元素 | 修改相关结点的指针域 |
删除操作 | 需要移动半个表长得元素 | 修改相关结点的指针域 |
如何选取存储结构:
例:
1-将两个有n个元素的有序表归并成一个有序表,其最少的比较次数为(A)
A、n
B、2n-1
C、2n
D、n-1
解析:
在归并算法中,当L1表中的所有元素均小于L2表中的所有元素时,比较的次数最少,为n,因为此时L1中的元素在比较了n次后已经全部被并入了顺序表,剩下的L2元素就不需要再比较。
如果题目问最多比较多少次,那就是2n-1次,此时L1与L2中的元素轮流被并入顺序表,每并入一个就比较一次,当剩下最后两个元素的时候(L1和L2表各一个),已经比较了2n-2次,这是还需进行一次比较就有一个表变成空表,至此比较结束,因此总的比较次数为2n-1.
2-在一个具有n个结点的有序单链表中插入一个新结点仍然保持有序的时间复杂度是(B)。
A、O(1)
B、O(n)
C、O(n²)
D、O(nlog2n)
解析:
假设单链表递增有序,在插入数据为x的结点之前,先要在单链表的中找到第一个大于x的结点的直接前驱p,在p之后插入该结点,查找过程的时间复杂度为O(n),插入过程的时间复杂度为O(1),整个过程的时间复杂度为O(n)。
3-在n个元素的线性表的数组表示中,以下时间复杂度为O(1)的操作是(C)
Ⅰ. 访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)
Ⅱ. 在最后一个结点后插入一个新的结点
Ⅲ. 删除第一个结点
Ⅳ. 在第i个结点后插入一个结点(1≤i≤n)
A、Ⅰ
B、Ⅱ、Ⅲ
C、Ⅰ、Ⅱ
D、Ⅰ、Ⅱ、Ⅲ
4-设线性表中有2n个元素,(A)在单链表上实现要比在顺序表上实现效率要高。
A、删除所有值为x的元素
B、在最后一个元素的后面插入一个新元素
C、顺序输出前k个元素
D、交换第i个元素和第2n-i-1个元素的值
5-将长度为n的单链表链接在长度为m的单链表后面,其算法的时间复杂度采用大O形式表示应该是(C)
A、O(1)
B、O(n)
C、O(m)
D、 O(n+m)
解析:
先遍历长度为m的单链表,找到这个长度为m的单链表的尾结点,然后将其next域置为另一个单链表的首结点,其时间复杂度为O(m)。
6-带头结点的单循环链表L(带头结点)的终端结点(由p所指向)满足(D)。
A、p->next == NULL
B、p == L
C、p->next == L
D、p->next == NULL&&p != L
解析:
带头结点的单循环链表中没有空指针域,故A错。 当终端结点跟头结点为同一个结点,即满足p==L时,链表为空,故B错。
当链表为空时,p指向头结点,同时也是终端结点,此时一定满足p->next == L。当链表不为空时,p指向终端结点,同样满足p->next
== L 所以p->next == L&&p!=L。
7-如果最常用的操作是取第i个元素的前驱结点。则采用(D)存储方式最节省时间。
A、单链表
B、双链表
C、单循环链表
D、顺序表
解析:
顺序表查找速度最快,当顺序表找到表中第i个元素的时间复杂度是O(1),取第i个元素前驱的时间复杂度也是最小的,为O(1).
8-若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点,则采用(D)。
A、单链表
B、给出表头指针的循环单链表
C、双链表
D、带头结点的循环双链表
解析:
在链表中插入或删除一个结点,需要修改相邻结点的指针域,如不特别指明,通常只给出链表头结点的地址,其他结点的地址只能从它的前驱或者后继得到,只有D选,能通过头结点指针直接获得最后一个结点的相邻结点的地址。
9-线性表最常用的操作实在最后一个结点之后插入一个结点或者删除第一个结点,则采用(D)存储方式最节省时间。
A、单链表
B、仅有头结点的单循环链表
C、双链表
D、仅有尾结点指针的单循环链表
解析:
节省时间联想到时间复杂度。 在有尾结点指针r的循环单链表中,在最后一个结点之后插入结点
s的操作是s->next=r->next;r->next=s;r=s;删除第一个结点的操作是p=r->next;r->next=p->next;free§;其时间复杂度均为O(1).所以选择D。
10-设有两个长度为n的单链表(带头结点),结点类型相同,若以h1为头结点指针的链表是非循环的,以h2为头结点指针的链表是循环的,则(B)。
A、对于两个链表来说,删除开始结点的操作,其时间复杂度分别为O(1)和O(n)。
B、对于两个链表来说,删除重点结点的操作,其时间复杂度都是O(n)。
C、循环链表要比非循环链表占用更多的内存空间。
D、h1和h2是不同类型的变量。
解析:
对于两个链表来说,要删除开始结点,其时间复杂度都为O(1),因为一直开始结点的前驱结点地址,即头结点地址。
对于两个链表来说,要删除终端结点,都需要从头结点开始找到终端结点的前驱结点,其时间复杂度都为O(n)。
两个链表占用内存空间相同,不要误以为循环链表比非循环链表多一个指向头结点的指针,其实非循环链表也有这个指针,只是它没有指向头结点而已。
h1和h2指向相同类型的结点,因此是相同类型的变量,单链表和循环单链表结点类型相同。只是表中结点的组织方式不同。