输出反向链接列表时出现无限循环

时间:2019-06-19 11:58:09

标签: go linked-list

我正在学习Go,并编写了以下代码来反向链接列表。但是,该代码无法按预期工作。

这是一个Node结构以及用于打印和反转列表的功能。

echo $((a + b))

问题在于,当我反转列表并调用type Node struct { number int previous *Node next *Node } func PrintList(node *Node) { for n := node; n != nil; n = n.next { fmt.Println(n) } } func ReverseList(node *Node) { var nextNodeRef *Node for n := node; n != nil; n = n.previous { if n.next == nil { n.next = n.previous n.previous = nil *node = *n break } else { nextNodeRef = n.next n.next = n.previous n.previous = nextNodeRef if n.next == nil { node = n } } } } 时,除了最后一个元素(以前是第一个元素)外,列表中所有元素的输出似乎都是无限的

这是我的PrintList函数:

main

这是我使用的func main() { myList := Node{1, nil, nil} myListAddress := &myList AddNumber(2, myListAddress) AddNumber(3, myListAddress) fmt.Println("My list:") PrintList(myListAddress) ReverseList(myListAddress) fmt.Println("My list reversed:") // here I always get list elements that contain 3, 2, 3, 2... PrintList(myListAddress) } 函数:

AddNumber

1 个答案:

答案 0 :(得分:1)

*node = *n

此行不执行您认为的操作。您可能希望更改外部*Node指向新的头(旧的尾巴),是吗?好吧,不,它只是替换了该位置上的节点。这就解释了为什么缺少以前的第一个值。

所以在执行最后一步之前,您会遇到类似的情况

nil <- 3 <=> 2 <=> 1 -> nil
       ↑           ↑
       n           node, myListAddress

然后,将node替换为n(即nil <- 3 -> 2)。这使结构看起来像这样:

      prev
 ┌────────────────┐
 │                │ node, myListAddress    
 ˅                │╱
nil <- 3 <=> 2 -> 3 ──┐
             ^        │next
             └────────┘

顺便说一句,此列表太小,以至于该图可能会误导您。包含更多元素的外观如下:

      prev
 ┌────────────────────────────┐
 │                            │ node, myListAddress    
 ˅                            │╱
nil <- 5 <=> 4 <=> 3 <=> 2 -> 5 ──┐
             ^                    │next
             └────────────────────┘

您可以在那里使用**Node。或者只是从函数中返回新的头部:

func ReverseList(node *Node) *Node {

    for n := node; n != nil; n = n.previous {
        if n.next == nil {
            n.next = n.previous
            n.previous = nil

            return n
        } else {
            n.next, n.previous = n.previous, n.next
        }
    }

    return node
}

然后

myListAddress = ReverseList(myListAddress)