首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现具有单链接列表的队列,使其ENQUEUE和DEQUEUE取O(1)?

如何实现具有单链接列表的队列,使其ENQUEUE和DEQUEUE取O(1)?
EN

Stack Overflow用户
提问于 2014-05-30 09:39:02
回答 3查看 17.2K关注 0票数 3

这是CLRS 3的一个练习

10.2-3通过单链列表L实现队列。ENQUEUE和DEQUEUE操作仍然需要O(1)时间。

使用单链接列表实现队列并不难。我的问题是时间的复杂性。如何实现采用O(1)的ENQUEUE和DEQUEQUE?

我在google上发现的,就像使用指针来跟踪头尾一样。现在的问题是,如何使用O(1)时间跟踪单链列表上的头尾?跟踪尾部需要O(n)。我说的对吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-30 09:48:17

管理头尾指针需要O(1)时间。

进入队列:

代码语言:javascript
复制
tail -> next = newNode;
newNode -> next = NULL;
tail = newNode;

Dequeue:

代码语言:javascript
复制
output_node = head;
head = head -> next;
// do whatever with output_node;

注意:在执行指针赋值之前,您还必须执行边界检查和内存分配/去分配。

票数 15
EN

Stack Overflow用户

发布于 2014-05-30 10:48:25

它是简单的,简单地在结尾和deque在前面,和设置2指针(或unique_ptrs)指向结束和前面,这就可以了。就像这样:

代码语言:javascript
复制
struct queue{
    Node *head;
    Node *tail;
    int node_cnt; // well, you can put this in if you like
};

Node *enque(Node *head, int data)
{
    Node *p = new Node(Node data);
    if (head)
    {
        head->next = p;
        head = p;
    }
    else
        head = p;
    ++ q.node_cnt;
    return head;
}

int deque(Node *tail)
{
    Node *p = tail;
    int x = tail->data;
    tail = tail.next();
    delete p;
    -- q.node_cnt;
    return x;
}

上面只是一个演示代码,但是您可以看到,您不需要遍历整个列表来进行enque或deque。

票数 3
EN

Stack Overflow用户

发布于 2014-05-30 09:45:39

如果允许使用std::list容器,则需要使用std

如果没有(我假设是这样的),尝试回答以下问题:为什么需要执行n个操作?你能把指向终点的指针存起来吗?

比方说,您有一个单独链接的列表和一个指针( headtail )--列表项有next指针。

  • 如果将一个新项排队,只需添加一个新项,修改前一个“第一个”项的next指针,并将head指针重新指向新项。这是3个操作= O(1)
  • 如果将一个项排出队列,则将last指针移动到上一项的next pointer‘所指向的指针,并删除项-2操作= O(1)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23951423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档