链接列表实现的指针问题

时间:2015-05-08 16:22:56

标签: data-structures go

尝试使用简单的addToLast函数实现LinkedList(将新节点添加到链表的末尾)而不是使用内置列表) 下面是代码(我用于调试的已删除的打印语句):

package main

import "fmt"

var first *Link
var last Link

func main() {
    AddToLast(10)
    AddToLast(20)
}

func AddToLast(d int) {
    if first == nil {
        last = Link{d, new(Link)}
        first = &last
    } else {
        last.next = &Link{d, new(Link)}
        last = *last.next
    }
}

type Link struct {
    data int
    next *Link
}

我对上述代码的理解:

内部AddToLast功能 - 在检查'first'是否为nil,即它没有任何元素之后,创建'last' 用10作为数据,新的空链接作为下一个。现在'first'被赋予相同的值 作为'最后'但使用记忆地址(作为参考 - 我不确定我的理解是否在这里不正确)

现在,当我们尝试插入20(下一个新元素)时,执行'AddToLast'中的else部分。 'last.next'被赋予一个值为20的链接,下一个为nil。现在'last'被移到'last.next', 确保'last'始终指向最后一个节点。

然而,因为我将'last'移动到'last.next','last'('s)内存地址的变化很明显,这也是 导致首先指向新的最后一个,即值为20.

为了避免这种情况,我尝试将'first'声明为Link而不是* Link。 但是,这样做不会使first.next指向新节点,即20.我对于我认为不正确的地方感到困惑。

1 个答案:

答案 0 :(得分:2)

不要改变last中的元素值,因为该元素已经创建。创建一个新的last,并将前一个next指针设置为指向它。以下是修改后的版本:http://play.golang.org/p/-X5RayC0gU

var first *Link
var last *Link

func AddToLast(d int) {
    next := &Link{d, nil}
    if first == nil {
        first = next
    } else {
        last.next = next
    }
    last = next
}

type Link struct {
    data int
    next *Link
}