了解单链接队列功能的实现

时间:2019-05-09 01:14:17

标签: python queue

我在这里显示以下问题: Problem 我不确定为什么这个答案是正确的,甚至不确定如何可视化此函数的执行情况。在while循环中显示的多重赋值表达式如何求值?

2 个答案:

答案 0 :(得分:1)

一旦以表格形式直观地显示了纸上的单链接列表,您会注意到,在每次迭代中,它所做的只是还原连接:

initial setup:

(1) -> (2) -> (3) -> (4) -> (5) -> nil
 p      q


step 1:

(1) <- (2) -> (3) -> (4) -> (5) -> nil
        p      q


step 2:

(1) <- (2) <- (3) -> (4) -> (5) -> nil
               p      q


step 3:

(1) <- (2) <- (3) <- (4) -> (5) -> nil
                      p      q


step 4:

(1) <- (2) <- (3) <- (4) <- (5)    nil
                             p      q

在这里

  • q.next = p的意思是“反向连接”;
  • p, q = q, q.next的意思是“向前推进一个节点”。

答案 1 :(得分:1)

多次分配就像一次分配,但是一次完成-您可以一次提供一个值元组,并一次分配一个等长的值元组:

a, b, c = 1, 2, 3
a == 1  # True
b == 2  # True
c == 3  # True

因此,这是函数的作用:

def reverse(self):
    p, q = self.head, self.head.next  # initialize p and q as first two elements of queue
    while q:  # iterate until q is None (that is, until we reach the end of the list)
              # This indicates that we will need to have a way for q to advance
              #   towards the end of the list. Presumably we'll be setting q as
              #   something that will eventually be None.
              # We know that the `next` of the last element in the list will be
              #   None, so that's a good starting point.
        _____________________  # blank line to fill in
    self.head, self.tail = self.tail, self.head  # swap head and tail of list with each other
    self.tail.next = None  # set the next element of the tail to None, as it should be.

那么,什么是空白?好了,我们可以弄清楚每个单独的变量需要更改为什么。我们将采用的方法是更改遇到的每个元素的方向-而不是.next指向下一个元素,而是使其指向上一个元素。因此,我们想要

q.next = p

因为q是列表中的第二个元素,而p是列表中的第二个元素。然后,我们只想将pq移至列表中的下两个元素:

p = q
q = q.next

通常,如果我们在单独的语句中执行这些操作,则需要一个临时变量来存储q.next的值-但是多次分配使我们可以绕开该变量:

q.next, p, q = p, q, q.next

在过程结束时,扭转了元素之间的所有链接,我们只是扭转了头和尾。将self.tail.next设置为None,因为self.tail用来的元素,self.head,我们最初跳过了它。