以Pythonic方式交换值会导致错误的答案

时间:2016-11-22 17:56:59

标签: python

问题:Swap Two Nodes in Linked List

答案1:

def swapNodes(self, head, v1, v2):
        dummyHead = ListNode(-1, head)
        pre_v1 = None
        pre_v2 = None
        curNode = dummyHead
        while curNode.next:
            if curNode.next.val == v1:
                pre_v1 = curNode
            elif curNode.next.val == v2:
                pre_v2 = curNode

            if pre_v1 and pre_v2:

                pre_v1.next, pre_v2.next, pre_v1.next.next, pre_v2.next.next = \
                pre_v2.next, pre_v1.next, pre_v2.next.next, pre_v1.next.next
                break

            curNode = curNode.next
        return dummyHead.next

当输入为1-> 2-> 3-> 4-> null时,此答案导致错误答案。输出应为1-> 4-> 3-> 2->空。但它返回1-> 4-> null

如果我改变

pre_v1.next, pre_v2.next, pre_v1.next.next, pre_v2.next.next = \
pre_v2.next, pre_v1.next, pre_v2.next.next, pre_v1.next.next

pre_v1.next, pre_v2.next = pre_v2.next, pre_v1.next
pre_v1.next.next, pre_v2.next.next = pre_v2.next.next, pre_v1.next.next

答案是对的。

我错过了什么吗?在以这种方式交换值时,我是否需要注意“陷阱”?

1 个答案:

答案 0 :(得分:0)

使用tuple-unpacking技巧在Python中交换值时你必须要理解的是它们基本上都是并行发生的,而不是顺序发生的。例如,在您的第一个示例中,pre_v1.next.next采用pre_v2.next_next的值,但在同一个表达式中您也更改pre_v1.next,因此一旦完成整个评估,{{1不知道你认为它在哪里,因为你现在基本上正在评估pre_v1.next.next,它也已被改变。