[英]How are these two different?
def reverseList(self, head):
prev, curr = None, head
while curr:
curr.next, prev, curr = prev, curr, curr.next
return prev
我不明白上面这个和
def reverseList(self, head):
prev, curr = None, head
while curr:
curr.next = prev
prev = curr
curr = curr.next
return prev
为什么他们有不同的结果? 我认为第一个和第二个声明的方式是相同的。
在第一个 function 中, curr
被分配了curr.next
的旧值,而在第二个 function 中, curr
被分配了curr.next
的新值(又名prev
)。
在第一个代码中,当执行curr = curr.next
时, curr.next
是它在“multi-assign”语句之前的任何值。
在第二个代码中,当执行curr = curr.next
时,由于之前执行的curr = prev
语句, curr.next
具有prev
的值。
如果你想用“multi-assign”语句运行 3 行代码,你应该使用:
curr.next, prev, curr = prev, curr, prev
这可以通过帮助ListNode
class 轻松显示(我使用next_
因为next
是 Python 中的保留字):
class ListNode:
def __init__(self, name=None, next_=None):
self.name = name
self.next_ = next_
def __str__(self):
return f'ListNode[{self.name}->{self.next_}]'
prev, curr = ListNode('P'), ListNode('C')
print(prev, prev.next_, curr, curr.next_)
curr.next_ = prev
prev = curr
curr = curr.next_
print(prev, prev.next_, curr, curr.next_)
# ListNode[P->None] None ListNode[C->None] None
# ListNode[C->ListNode[P->None]] ListNode[P->None] ListNode[P->None] None
prev, curr = ListNode('P'), ListNode('C')
print(prev, prev.next_, curr, curr.next_)
curr.next_, prev, curr = prev, curr, prev
print(prev, prev.next_, curr, curr.next_)
# ListNode[P->None] None ListNode[C->None] None
# ListNode[C->ListNode[P->None]] ListNode[P->None] ListNode[P->None] None
他们在第一种方法中切换值,但在第二种方法中,它将变量相互分配。
这是因为在第一行代码中,所有的赋值都是使用原始值一次执行的
在第二种情况下,当您将 curr.next 分配给 curr 时,curr.next 已经等于之前分配的 prev。 所以 curr 最终得到 prev 的值,不像第一种方法,它们都得到原始值
class X:
def __init__(self, value):
self.value = value
self.next = None
head = X(1)
head.next = X(2)
head.next.next = X(3)
head.next.next.next = X(4)
head.next.next.next.next = X(5)
prev, curr = None, head
while curr:
tmp = curr.next #Here...
curr.next = prev
prev = curr
curr = tmp #and here.
while prev:
print(prev.value)
prev = prev.next
对于第二个示例(即没有变量交换),您需要一个临时变量来存储curr.next
的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.