队列是使用非循环单向链表实现的。队列有一个头指针和一个尾指针,如图所示。让 n 表示队列中的节点数。通过在头部插入一个新节点来实现“入队”,通过从尾部删除一个节点来实现“出队”。
对于该数据结构,以下哪一项是最省时的“入队”和“出队”实现的时间复杂度?
(A) Θ(1), Θ(1)
(B) Θ(1), Θ(n)
(C) Θ(n), Θ(1)
(D) Θ(n), Θ(n)答案:(乙)
说明:对于入队操作,在恒定时间量(即 Θ(1))内执行,因为它只修改两个指针,即,
Create a Node P.
P-->Data = Data
P-->Next = Head
Head = P
对于出队操作,我们需要单链表的倒数第二个节点的地址来使其下一个指针为NULL。由于在单向链表中我们无法访问它的前一个节点,所以需要遍历整个链表来得到链表的倒数第二个节点,即,
temp = head;
While( temp-Next-->Next != NULL){
temp = temp-Next;
}
temp-->next = NULL;
Tail = temp;
因为,我们为每个出队遍历整个链接,所以时间复杂度将为 Θ(n)。
选项(B)是正确的。
这个问题的测验