📜  数据结构 |链表 |问题 12

📅  最后修改于: 2021-09-08 12:50:26             🧑  作者: Mango

一个循环链表用于表示一个队列。单个变量 p 用于访问队列。 p 应该指向哪个节点,这样 enQueue 和 deQueue 操作都可以在恒定时间内执行? (门 2004)
循环链表

(A)后方节点
(B)前端节点
(C)不能用单个指针
(D)靠近前面的节点答案:(一)
解释:答案不是“(b) 前节点”,因为我们不能在 O(1) 中从前面得到后部,但是如果 p 是后部我们可以在 O(1) 中同时实现 enQueue 和 deQueue 因为从后部我们可以得到O(1) 中的前面。下面是示例函数。请注意,这些功能只是示例不起作用。缺少处理基本情况的代码。

/* p is pointer to address of rear (double pointer).  This function adds new 
   node after rear and updates rear which is *p to point to new node  */
void  enQueue(struct node **p, struct node *new_node)
{
    /* Missing code to handle base cases like *p is NULL */
       
     new_node->next = (*p)->next;
     (*p)->next = new_node;
     (*p) = new_node /* new is now rear */
     /* Note that p->next is again front and  p is rear */
  
 }
  
/* p is pointer to rear. This function removes the front element and 
    returns the dequeued element from the queue */
struct node *deQueue(struct node *p)
{
    /* Missing code to handle base cases like p is NULL,
        p->next is NULL,...  etc */
  
    struct node *temp = p->next;
    p->next = p->next->next;
    return temp;
    /* Note that p->next is again front and  p is rear */
}

这个问题的测验
这个问题的测验