在Go语言中一行反转LinkedList

ctehm74n  于 2023-06-03  发布在  Go
关注(0)|答案(1)|浏览(300)

我刚刚在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 = prevhead.Next = nil,现在是head = [1->nil]
1.然后,prev = head(在此步骤中,prev = [1->nil]与上一步骤中的head相同)

  1. 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
    }

我说的对吗?为什么会这样呢?

vdzxcuhz

vdzxcuhz1#

表达式左侧的变量此时被赋给表达式右侧的值。这是对语言的巧妙运用。
为了更容易理解,让我们通过一个例子。

设置

这是我们的链接列表:
1 -> 2 -> 3 -> 4 ->无
在执行函数之前,

  • 头为 * 节点1
  • prev为nil(未初始化)
  • 头。下一个是 * 节点2

循序渐进

prev, head, head.Next = head, head.Next, prev

我们来分析一下

  • prev(nil)= head(*Node 1)
  • head(*Node 1)= head.Next(*Node 2)
  • head.Next(*Node 2)= prev(nil)

下一个循环,

  • prev(*Node 1)= head(*Node 2)
  • head(*Node 2)= head.Next(*Node 3)
  • head.Next(*Node 3)= prev(*Node 2)

摘要

基本上,它将head.Next反转到前一个节点,并将prev和head移动到下一个节点。
将其与Go语言中的教科书算法进行比较,可以清楚地看出:

func reverseList(head *ListNode) *ListNode {
var prev *ListNode

for head != nil {
    nextTemp := head.Next
    head.Next = prev
    prev = head
    head = nextTemp
}

return prev

}
我希望这是澄清。

相关问题