首页 > 解决方案 > Python Linked List 如何分配值

问题描述

下面是将节点的每个数字除以 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

标签: pythonlinked-list

解决方案


我很困惑为什么 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)

推荐阅读