作者iwantstronge (...)
看板Python
标题[问题] 新手解LeetCode:Swap Nodes in Pairs
时间Wed Aug 3 02:58:25 2016
最近开始用Python解题
未学过正规的Python 因此对於一些观念尚不太了解
题目是将链表中的元素两两对调
例如: Given 1->2->3->4, return the list as 2->1->4->3
我的Code如下:
class Solution(object):
def swapPairs(self, head):
if head is None or head.next is None:
return head
dummy = ListNode(0)
dummy.next = head
pre = dummy
tmp = head
while tmp and tmp.next:
pre.next = tmp.next
tmp.next = tmp.next.next <---有疑问
pre.next.next = tmp <---有疑问
pre = tmp
tmp = tmp.next
return dummy.next
以上的Code没问题
但如果我将上面标示有疑问的那两行顺序对调,改成:
class Solution(object):
def swapPairs(self, head):
if head is None or head.next is None:
return head
dummy = ListNode(0)
dummy.next = head
pre = dummy
tmp = head
while tmp and tmp.next:
pre.next = tmp.next
pre.next.next = tmp <---已对调
tmp.next = tmp.next.next <---已对调
pre = tmp
tmp = tmp.next
return dummy.next
系统将会出现Time Limit的错误
就我的认知,这两行对调应该完全没差别?
另一个问题是,我在一开始将dummy指定给pre 扫描链表时是用pre在跑
而最後直接return dummy时,dummy也会跟着pre的变化而改变? 代表那个'等号'的operator
是有传址的意味在,而不像一般的等号直接复制到另一块新的记忆体?
以上问题,还请高手们提点,感激不尽!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.31.161.60
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1470164308.A.F45.html
1F:推 Sunal: 你的第二个问题印出id(pre)跟id(dummy)就可以知道了 08/03 11:59
2F:推 Yshuan: 你的推测是对的 通常是因为mutable 这case是小整数的优化 08/03 14:24
3F:推 s06yji3: 你那两个对调,在while後的第3行就变成无限回圈了 08/03 19:22
4F:推 s06yji3: 物件的=是设定reference 08/03 19:24
5F:推 s06yji3: 看错,是第二行就变无限回圈了(对调的第一行) 08/03 19:32