答案 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
是列表中的第二个元素。然后,我们只想将p
和q
移至列表中的下两个元素:
p = q
q = q.next
通常,如果我们在单独的语句中执行这些操作,则需要一个临时变量来存储q.next
的值-但是多次分配使我们可以绕开该变量:
q.next, p, q = p, q, q.next
在过程结束时,扭转了元素之间的所有链接,我们只是扭转了头和尾。将self.tail.next
设置为None
,因为self.tail
是用来的元素,self.head
,我们最初跳过了它。