在一个长度为n的带头结点的单链表h上,另设有尾指针r(指向尾结点),执行()操作与
与链表的长度有关。
正确答案:B
A.删除单链表中的第一个元素
B.删除单链表中的最后一个元素
C.在单链表第一个元素前插入一个新元素
D.在单链表最后一个元素后插入一个新元素
解析:
尾结点的前驱不知道
如果最常用的操作是取第i个结点及其前驱,则采用()存储方式最节省时间。
正确答案:D
单链表
双链表
单循环链表
顺序表
解析:
如顺序表的每个结点占用
l
e
n
len
len个内存单元,用
l
o
c
a
t
i
o
n
(
k
i
)
location (ki)
location(ki)表示顺序表中第i个结点ki所占内存空间的第1个单元的地址。则有如下的关系:
l
o
c
a
t
i
o
n
(
k
i
+
1
)
=
l
o
c
a
t
i
o
n
(
k
i
)
+
l
e
n
location (ki+1) = location (ki) +len
location(ki+1)=location(ki)+len
l
o
c
a
t
i
o
n
(
k
i
)
=
l
o
c
a
t
i
o
n
(
k
1
)
+
(
i
−
1
)
l
e
n
location (ki) = location(k1) + (i-1)len
location(ki)=location(k1)+(i−1)len
已知两个长度分别为m 和 n 的升序链表,若将它们合并为一个长度为 m+n 的降序链表,则最坏情况下的时间复杂度是( )。
题目有问题
O(n)
O(m+n)
O(min(m ,n))
O(max(m,n))
解析:
如果从移动次数的角度上去理解,那么因为是两个升序表merge成一个降序表,所以采用头插法,因此两表中的所有节点必须一个一个地链接到结果表中,这样的话,任何情况下都需要移动m+n个元素。因此,最好、最坏都是
O
(
m
+
n
)
O(m+n)
O(m+n)
如果从比较次数的角度上去理解,有
最多比较次数,
m
+
n
−
1
m+n-1
m+n−1
最少比较次数,
m
i
n
(
m
,
n
)
min(m,n)
min(m,n)
那么,
最坏是
O
(
m
a
x
(
m
,
n
)
)
O(max(m,n))
O(max(m,n)) (有
O
(
m
+
n
)
O(m+n)
O(m+n)等价于
O
(
m
a
x
(
m
,
n
)
)
O(max(m,n))
O(max(m,n)))
最好是
O
(
m
i
n
(
m
,
n
)
)
O(min(m,n))
O(min(m,n))
下列程序段的时间复杂度是
count = 0;
for(k=1;k<n;k*=2)
for(j=0;j<n;j++)
count++;
答案:
O(nlogn)
解析:
外层循环的时间复杂度是
O
(
l
o
g
n
)
O(logn)
O(logn),内层循环的时间复杂度是
O
(
n
)
O(n)
O(n)