我刚刚在LeetCode上找到了一个使用Golang中的一行的反向LinkedList解决方案。这是真的工作,但我不明白如何。
就是这样
func reverseList(head *ListNode) (prev *ListNode) {
for head != nil {
prev, head, head.Next = head, head.Next, prev
}
return
}
例如,让列表是[1->2->3->4->5->nil]
。
我知道这是工作
1.首先执行head.Next = prev
(head.Next = nil
,现在是head = [1->nil]
)
1.然后,prev = head
(在此步骤中,prev = [1->nil]
与上一步骤中的head
相同)
head = head.Next
和有魔法。对于第二步的prev
,Go使用head = [1->nil]
,但在此步骤之后head = [2->3->4->5->nil]
所以当head != nil
迭代时,在第二步prev = [2->1->nil]
,head = [3->4->5->nil]
等等。
这条线可以表示为:
for head != nil {
a := *head
prev, a.Next = &a, prev
head = head.Next
}
我说的对吗?为什么会这样呢?
1条答案
按热度按时间vdzxcuhz1#
表达式左侧的变量此时被赋给表达式右侧的值。这是对语言的巧妙运用。
为了更容易理解,让我们通过一个例子。
设置
这是我们的链接列表:
1 -> 2 -> 3 -> 4 ->无
在执行函数之前,
循序渐进
我们来分析一下
下一个循环,
摘要
基本上,它将head.Next反转到前一个节点,并将prev和head移动到下一个节点。
将其与Go语言中的教科书算法进行比较,可以清楚地看出:
}
我希望这是澄清。