为什么'p = p.rest'不影响CS61A Hw06中Q5的结果变量

问题描述 投票:0回答:2

在迭代解决方案中,有谁知道为什么

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

就我个人而言,我已经尝试过递归解决方案,但我无法理解网站上提供的这种迭代解决方案。

python recursion iteration
2个回答
0
投票

p = p.rest
不会影响result
变量,因为它只是
改变,其中p
指向不修改result
链表本身。


0
投票

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
用于遍历构建链表。

© www.soinside.com 2019 - 2024. All rights reserved.