繁体   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