Python 为什么函数中的列表输出不同于main中的列表输出?
我的问题是关于LeetCode练习: 给定一个链表,每两个相邻节点交换一次,并返回其头部 例1: 例2: 例3: 我包括了一个打印链表的Python 为什么函数中的列表输出不同于main中的列表输出?,python,python-3.x,linked-list,Python,Python 3.x,Linked List,我的问题是关于LeetCode练习: 给定一个链表,每两个相邻节点交换一次,并返回其头部 例1: 例2: 例3: 我包括了一个打印链表的lprint()函数 创建此列表时: 1->2->3->4->5->6 …调用swap,然后在\uuuuuu main\uuuuuu区域中调用lprint(head),然后链表的第一个值仍然是1: 1->4->3->6->5 虽然它应该是: 2->1->4->3->6->5
lprint()
函数
创建此列表时:
1->2->3->4->5->6
…调用swap
,然后在\uuuuuu main\uuuuuu
区域中调用lprint(head)
,然后链表的第一个值仍然是1
:
1->4->3->6->5
虽然它应该是:
2->1->4->3->6->5
但是如果我在defswap()
区域调用lprinf(head)
,答案是正确的
我不明白为什么会有这种差异
这是我的密码:
class Node:
def __init__(self, val):
self.val = val
next = None
def lprint(head):
p = head
while p:
if p.next:
print(p.val, end='->')
else:
print(p.val)
p = p.next
def swap(head):
if not head: return None
p0, p1, p2 = None, head, head.next
while p1 and p2:
if not p0:
p1.next, p2.next = p2.next, p1
head = p2
p1, p2 = p2, p1
p0, p1, p2 = head, p1.next, p2.next
if p1 and p2:
p0, p1, p2 = p0.next, p1.next, p2.next
else:
break
else:
p0.next, p1.next, p2.next = p2, p2.next, p1
p1, p2 = p2, p1
p0, p1, p2 = p0.next, p1.next, p2.next
if p1 and p2:
p0, p1, p2 = p0.next, p1.next, p2.next
else:
break
print('inner:',end=' ')
lprint(head) # correct answer
if __name__ == '__main__':
for i in range(6):
if i == 0:
head = p = Node(i+1)
else:
p.next = Node(i+1)
p = p.next
lprint(head) # before swap
swap(head)
lprint(head) # wrong answer
至于它没有按预期打印最终结果的原因:这是因为
swap
函数修改了其名为head
的局部变量,但调用方没有被告知此更改,并且仍然有自己的head
变量引用最初位于第一个位置的节点,但现在处于第二位。因此,打印该列表将从第二个节点开始,而不是从第一个节点开始
请注意,LeetCode挑战要求您返回对修改列表的引用。因此,您的交换
功能应以以下内容结束:
return head
…您的主代码应采用该返回值:
head = swap(head)
如果这样做,对printl
的第二次调用将输出您所期望的结果
但是请注意,在LeetCode挑战中,您只需提交
交换
函数的实现,因为LeetCode将调用该函数本身,并验证函数返回的值。指向练习本身的快速链接,在你的问题中可能也有这样一个问题:我认为在leetcode练习中,你根本不应该使用if\uu\u name
块。代码是否执行,或者它会给您什么作为错误?另外,你能不能把leetcode的完整代码包括进来,这样我就可以使用它了,我在粘贴你的代码时遇到了缩进的问题
class Node:
def __init__(self, val):
self.val = val
next = None
def lprint(head):
p = head
while p:
if p.next:
print(p.val, end='->')
else:
print(p.val)
p = p.next
def swap(head):
if not head: return None
p0, p1, p2 = None, head, head.next
while p1 and p2:
if not p0:
p1.next, p2.next = p2.next, p1
head = p2
p1, p2 = p2, p1
p0, p1, p2 = head, p1.next, p2.next
if p1 and p2:
p0, p1, p2 = p0.next, p1.next, p2.next
else:
break
else:
p0.next, p1.next, p2.next = p2, p2.next, p1
p1, p2 = p2, p1
p0, p1, p2 = p0.next, p1.next, p2.next
if p1 and p2:
p0, p1, p2 = p0.next, p1.next, p2.next
else:
break
print('inner:',end=' ')
lprint(head) # correct answer
if __name__ == '__main__':
for i in range(6):
if i == 0:
head = p = Node(i+1)
else:
p.next = Node(i+1)
p = p.next
lprint(head) # before swap
swap(head)
lprint(head) # wrong answer
return head
head = swap(head)