2017-08-22 26 views
2

LeetCodeから質問があります。私には分かりません。Pythonでの参照と値の受け渡し

質問:リンクリストを考えると

、すべての2つの隣接ノードを交換し、その 頭を返します。

たとえば、1-> 2-> 3-> 4と指定すると、リストは 2-> 1-> 4-> 3に戻す必要があります。

アルゴリズムでは一定のスペースしか使用しないでください。リストの の値を変更することはできません。ノード自体のみを変更することができます。

私のソリューション:

class ListNode(object): 
    def __init__(self, x): 
     self.val = x 
     self.next = None 

class Solution(object): 
    def swapPairs(self, head): 
     """ 
     :type head: ListNode 
     :rtype: ListNode 
     """ 

     dummy = ListNode(0) 
     dummy.next = head 
     curr = dummy 

     while curr.next and curr.next.next: 
      a = curr.next 
      b = curr.next.next 

      curr.next = b 
      a.next = b.next 
      b.next = a 
      curr = a 

     return dummy.next 

混乱:

私はcurr = dummyを行うと、ダミーが参照によって渡され、curr突然変異しdummyを変異されているようです。しかし、返信文return dummy.nextreturn curr.nextと同じではありませんか? curr = dummy以降、ループの最後にはcurrがリストの末尾にあるので、dummyもリストの最後にあるべきではありませんか?しかし、dummyはまだリストの先頭にあり、dummy.nextは関数に渡されたリストの先頭ですが、正しい方法で変更されています。私はまた

、:

 if curr is dummy: 
      print("BEGIN") 

     while curr.next and curr.next.next: 
      a = curr.next 
      b = curr.next.next 

      curr.next = b 
      a.next = b.next 
      b.next = a 
      curr = a 

     if curr is dummy: 
      print("END") 

BEGINが印刷されますが、ENDにはありません。

誰かが私のために混乱をクリアすることはできますか?

+1

'、curr'ははい、最初は' dummy'と同じですが、ループ内で 'CURR = A'を設定

は、この例で考えてみましょう'curr'は' dummy'と同じではありません。あなたは何かにそれを設定しています。このサイトでPythonの値/参照、変数、名前のバインディングなどに関する多くの質問を探してください。 – BrenBarn

+0

** Python **では参照渡しのセマンティクスはありません。 –

+3

[Ned Batchelderの事実と神話のPythonの名前と値について](https://nedbatchelder.com/text/names.html)をお読みください。 –

答えて

3

var = xを割り当てると、varxになります。同じオブジェクトを指す他の変数がこの後にxを指すことはありません。

>>> a = {'p': 2} 
>>> b = a 
>>> b 
{'p': 2} 
>>> b['p'] = 4 
>>> a 
{'p': 4} 
>>> b = {'q': 3} 
>>> a 
{'p': 4} 
>>> b 
{'q': 3} 

またはこの:

>>> class Node: 
...  def __init__(self, nxt): 
...   self.nxt = nxt 
...  def __repr__(self): 
...   return '(Node => %s)' % self.nxt 
... 
>>> a = Node(Node(2)) 
>>> a 
(Node => (Node => 2)) 
>>> b = a 
>>> b 
(Node => (Node => 2)) 
>>> a.nxt = Node(4) 
>>> a 
(Node => (Node => 4)) 
>>> b 
(Node => (Node => 4)) 
>>> b = b.nxt 
>>> a 
(Node => (Node => 4)) 
>>> b 
(Node => 4) 
関連する問題