我在这里有以下代码:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if head == None:
return
pre, node = None, head
while node:
pre, node.next, node = node, pre, node.next
return pre
我正在试图使它的工作方式化。如果从列表开始,则pre
成为head
,因为node
被分配给head
。那么node.next
被分配给pre
,那么它指向自己吗?最后,node
变成node.next
,这本身就是?我在这里想念什么吗?
答案 0 :(得分:1)
主要思想是将原始的头节点转换为新链表的最后一个节点,并将原始的最后一个节点转换为新的头节点,并转换节点之间的链接方向。
假设原始链表包含2个节点。
首先是pre = None
,node = head
,然后是node.next = pre
,这意味着原始头节点成为新链表的最后一个节点。 node = node.next
意味着转换节点之间的链接方向。 node.next = pre
意味着将原来的最后一个转换为新的头部。
while
重复执行上述过程
答案 1 :(得分:1)
多次分配与一次又一次的多次分配不同。所不同的是,语句右侧的值在任何反弹之前都已评估。实际上,右侧的值打包在一个元组中,然后解压缩到左侧的名称中。
在这种情况下这很重要,因为这意味着右侧的node.next
将保存其值,因此当您将其重新绑定到其他内容(pre
)时,旧值仍然可用成为赋值后的新node
值。
您可能想尝试一些更简单的任务,例如经典的交换操作:
x = 1
y = 2
x, y = y, x # swap x and y's values
print(x, y) # prints "2 1"
_tup = y, x # this is how it works, first pack the RHS values into a tuple
x, y = _tup # then unpack the values into the names on the LHS
print(x, y) # prints "1 2" as we've swapped back