簡體   English   中英

這兩者有何不同?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM