python - 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
解决方案
我很困惑为什么 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)
推荐阅读
- dart - Dart “For 循环” “If Else” “布尔返回”
- excel - 有没有办法添加ISBLANK函数,这样如果“b1”中没有输入数据,excel中不会显示任何内容?
- vbscript - 如何使用 vbscript 从标签或 HTML 类中提取数据?只有我选择的标签或类
- html - 谷歌地图:用坐标重置标记
- vb.net - 过滤绑定源
- python - 如何在opencv python中执行缩放和旋转不变模板(特征)匹配和对象检测
- python - 存储 python.exe 的驱动器是否重要?
- raku - 创建并填充一组 Raku 对象?
- apache-spark - 左反加入团体
- javascript - 使用 btn 对表单进行 HTML5 验证,触发 JS 函数发送 php 邮件并在成功时显示模式