问题: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
答案是对的。
我错过了什么吗?在以这种方式交换值时,我是否需要注意“陷阱”?
答案 0 :(得分:0)
使用tuple-unpacking技巧在Python中交换值时你必须要理解的是它们基本上都是并行发生的,而不是顺序发生的。例如,在您的第一个示例中,pre_v1.next.next
采用pre_v2.next_next
的值,但在同一个表达式中您也更改pre_v1.next
,因此一旦完成整个评估,{{1不知道你认为它在哪里,因为你现在基本上正在评估pre_v1.next.next
,它也已被改变。