2016-11-22 10 views
0

質問:Swap Two Nodes in Linked ListSwaping値が間違った答えにつながる

回答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-> nullでなければなりません。私は

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 

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 

を変更した場合でも、1 - > 4 - >ヌル

を返す答えは正しいです。

私は何か不足していますか?このように値を入れ替える際には注意が必要な「トラップ」がありますか?

+1

[Pythonでの複数の割り当てと評価の順序]の可能な複製(0120-18753)/マルチプルアサイメント - と - 評価 - オーダー - イン - パイソン –

+0

Moinuddinが述べたように、別の順序で評価します:順序は重要です: 'pre_v1.next'と' pre_v1.next.next'を入れ替える順序は結果に影響します – TemporalWolf

答えて

0

タプルアンパックトリックを使用してPythonで値を入れ替えることで理解しなければならないことは、それらが本質的にすべてがパラレルで、逐次的に起こらないことです。あなたの最初の例では、pre_v1.next.nextpre_v2.next_nextの値をとりますが、同じ式ではpre_v1.nextも変更しますので、全体が評価されると、pre_v1.next.nextはあなたが今いると思うところを指しません本質的には(pre_v2.next).nextと評価され、これも変更されています。

関連する問題