【问题标题】:Python Linked List how value gets assignedPython Linked List 如何分配值
【发布时间】:2020-09-25 06:32:40
【问题描述】:

下面是一个将节点的每个数字除以10的代码。例如,节点= 2->3->3,输出将是0.2->0.3->0.3。

但是我很困惑为什么self.head.next 每次都会更新,因为它是cur 接收更改。假设a=1,b=2,我们做a(cur)=b(self.head),如果我们把a的值改为3,那不会影响b,b仍然是2。所以我不明白为什么更改cur 会影响self.head.next。谢谢!

class node(object):
    def __init__(self,value,next=None):
        self.value=value
        self.next=next

class linkedlist(object):
    def __init__(self):
        self.head=None
        self.next=None
    def test(self,List):
        self.head=node(0)
        cur=self.head
        while List:
            s=List.value/10
            cur.next=node(s)
            cur=cur.next
            List=List.next if List else 0
        return self.head.next

假设下面是输入:

 a=node(2)
 a=node(2,a)
 a=node(3,a)
 c=linkedlist()

下面是输出:

c.test(a).value=0.3
c.test(a).next.value=0.2
c.test(a).next.next.value=0.2

【问题讨论】:

  • 你能提供一个示例输入和输出吗?顺便说一句,您可以使用List.head 而不是只使用List 以使代码更具可读性。截至目前,我看到您的列表仅包含以 0 为值的节点。

标签: python linked-list


【解决方案1】:

我很困惑为什么 self.head.next 每次都会更新,因为它是 cur 接收更改

这是因为,至少在循环的第一次迭代中,self.head cur

cur=self.head

之后,它使用“虚拟”节点作为self.head(因此第一个cur)使用更新的值构建一个新列表,然后将其丢弃,只返回它的next。但是,我发现该代码相当混乱且过于复杂(我自己很难理解),例如最后一行中的三元 ... if ... else ... 是多余的,因为此时 List 不能是 None。此外,没有必要将其设为一个类,因为它的任何成员属性都不会在方法的单次执行范围之外使用。

相反,您可以使用一个简单的函数,例如使用循环并修改原始列表,或者更简单,递归地创建一个新列表:

def div(lst, d=10):
    first = lst
    while lst:
        lst.value /= d
        lst = lst.next
    return first

def div(lst, d=10):
    return node(lst.value / 10, div(lst.next, d)) if lst else None

为了更容易调试,您还可以将__repr__ 方法添加到您的node 类:

    def __repr__(self):
        return "(%r %r)" % (self.value, self.next)

【讨论】:

    猜你喜欢
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    相关资源
    最近更新 更多