我正在做一个来自LeetCode的问题。我发现了一些对我来说没有多大意义的东西。
问题:
给定一个链表,交换每两个相邻节点并返回其 头。
例如,给定 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
没有。
有人可以为我消除困惑吗?
当你做作业var = x
时,你会var
指向x
。它不会使指向同一对象的其他变量指向在此之后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)