[英]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.