在迭代解决方案中,有谁知道为什么
p = p.rest
不影响result
变量?由于上面的代码p.rest = Link(item)
只是修改了结果,那么这部分添加p = p.rest
的目的是什么?
问题及解决方法如下:
def two_list(vals, counts):
"""
Returns a linked list according to the two lists that were passed in. Assume
vals and counts are the same size. Elements in vals represent the value, and the
corresponding element in counts represents the number of this value desired in the
final linked list. Assume all elements in counts are greater than 0. Assume both
lists have at least one element.
>>> a = [1, 3]
>>> b = [1, 1]
>>> c = two_list(a, b)
>>> c
Link(1, Link(3))
>>> a = [1, 3, 2]
>>> b = [2, 2, 1]
>>> c = two_list(a, b)
>>> c
Link(1, Link(1, Link(3, Link(3, Link(2)))))
"""
result = Link(None)
p = result
for index in range(len(vals)):
item = vals[index]
for _ in range(counts[index]):
p.rest = Link(item)
p = p.rest
return result.rest
就我个人而言,我已经尝试过递归解决方案,但我无法理解网站上提供的这种迭代解决方案。
行
p = p.rest
不会影响result
变量,因为它只是改变,其中
p
是指向,不修改
result
链表本身。
p.rest = Link(item)
修改
rest
引用的
Link
对象的
p
属性。但是,它不会直接修改
result
变量。
result
被分配给一个新的
Link
对象,并以
None
作为其值。这个
Link
对象充当链表的虚拟头。
p
初始化为与
Link
引用相同的
result
对象,因此
p
和
result
都指向同一个对象。
p.rest = Link(item)
将具有当前值项的新
Link
对象分配给
rest
引用的
Link
对象的
p
属性。这通过在
p
引用的当前节点之后添加新节点来扩展链表。
p = p.rest
更新
p
指针以指向新创建的节点。这会将
p
指针在链表中向前移动,准备添加下一个节点。
p.rest = Link(item)
修改了链表结构,在
p
引用的当前节点后面添加了一个新节点,它并没有直接修改
result
变量。
result
继续引用原来的虚拟头节点,而
p
用于遍历构建链表。