这涉及到我在尝试解决链表反转问题时遇到的一个问题。
首先,让我放一些预备代码来定义链表和快速生成链表的方法:
我会尝试写一个反转链表的方法,有三个变量交换,这个想法很简单,创建一个虚拟头节点,并不断在虚拟头节点和虚拟头节点的下一个节点之间添加节点,以便将其反转。
首先,让我放一些预备代码来定义链表和快速生成链表的方法:
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def __repr__(self):
if self.next:
return "{}->{}".format(self.val, repr(self.next))
else:
return "{}".format(self.val)
def genNode(*nodes, end=None):
if len(nodes) == 1 and type(nodes[0]) == list:
nodes = nodes[0]
for i in nodes[::-1]:
n = ListNode(i)
n.next, end = end, n
return n if nodes else None
我的问题是,我发现交换机制仍然取决于我编写的变量序列。
原本在Python中讨论交换值时,我们可以这样做:
a, b = b, a
如果我有相同的要求,它应该以相同的方式工作。
b, a = a, b
我会尝试写一个反转链表的方法,有三个变量交换,这个想法很简单,创建一个虚拟头节点,并不断在虚拟头节点和虚拟头节点的下一个节点之间添加节点,以便将其反转。
def rev(head):
dummy = ListNode('X')
while head:
dummy.next, head.next, head = head, dummy.next, head.next
return dummy.next
a = genNode(1,2,3,4)
print(rev(a)) # >>> 4->3->2->1
但是,如果我稍微调整一下这3个变量的顺序:
def rev2(head):
dummy = ListNode('X')
while head:
dummy.next, head, head.next, = head, head.next, dummy.next,
return dummy.next
a = genNode(1,2,3,4)
print(rev2(a)) # >>> AttributeError: 'NoneType' object has no attribute 'next'
看起来这里是序列很重要,有人可以告诉我如果有超过两个变量,Python如何评估交换值吗。
谢谢!
a, b = b, a
对于简单的交换是可以的,但对于更复杂的情况,最好编写单独的赋值语句。 - chepner