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.next
はreturn 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
にはありません。
誰かが私のために混乱をクリアすることはできますか?
'、curr'ははい、最初は' dummy'と同じですが、ループ内で 'CURR = A'を設定
は、この例で考えてみましょう'curr'は' dummy'と同じではありません。あなたは何かにそれを設定しています。このサイトでPythonの値/参照、変数、名前のバインディングなどに関する多くの質問を探してください。 – BrenBarn
** Python **では参照渡しのセマンティクスはありません。 –
[Ned Batchelderの事実と神話のPythonの名前と値について](https://nedbatchelder.com/text/names.html)をお読みください。 –