这个链接的队列代码如何工作? - Python

时间:2017-09-06 00:17:52

标签: python linked-list

我正在努力了解这段代码是如何工作的,并且我对如何思考它感到困惑,尤其是如何将所有内容链接在一起。

以下是我的想法:

当Queue(Q)初始化时,我们有Q = [self._head = None,self._tail = None,size = 0](不是python代码 - 只是组织数据属性的可视方式),然后当第一个元素入队时,我们创建一个节点N1 =(e1,None),它被分配给self._head和self._tail,Q = [(e1,None),(e1,None),1]。

当第二个元素排队到队列时,我们创建第二个节点N2 =(e2,None),我们有self._tail._next = newest,它将Q更新为Q = [(e1,None),(e1, N2),1]。然后代码有self._tail = newest,然后将Q更新为Q = [(e1,None),(e2,None),2]。

似乎它实际上并没有在这里链接任何东西。在理解这段代码时,我到底错过了什么?

class LinkedQueue:

    class _Node:

        __slots__='__element', '__next'

        def __init__(self, element, next):
            self._element = element
            self._next = next

    def __init__(self):
        self._head = None
        self._tail = None
        self._size = 0

    def dequeue(self):
        if self.is_empty():
            raise Exception('Queue is empty')
        answer = self._head._element
        self._head = self._head._next
        self._size -= 1
        if self.is_empty():
            self._tail = None
        return answer

    def enqueue(self, e):
        newest = self._Node(e, None)
        if self.is_empty():
            self._head = newest
        else:
            self._tail._next = newest
        self._tail = newest
        self._size += 1

1 个答案:

答案 0 :(得分:1)

队列将至少有两个点:一个是头部,一个是尾部。这允许您按照添加的顺序迭代节点,并将新节点添加到队列的末尾。我们可以将空队列可视化为:

    Head -> <- Tail

1添加到队列:

    Head -> 1 <- Tail

2添加到队列:

    Head -> 1 
            2 <- Tail

3添加到队列:

    Head -> 1 
            2
            3 <- Tail

将元素排队意味着将Head移动到下一个元素并返回旧值。

            1 <- first_element

    Head -> 2
            3 <- Tail

如果你想看一下,我有一个fairly basic Queue implementation