我正在try 从头开始在Golang实现LinkedList操作.但我在处理删除第一个元素时发现了一个问题.我的方法是使用OOP风格,但第一个元素似乎没有被删除.这是我写的代码,

type LinkedList struct {
    Value int
    next  *LinkedList
}

func (ll *LinkedList) Remove(index int) error {
    pointer := ll
    var pointerPrev *LinkedList = nil
    current := 0

    for current < index {
        pointerPrev = pointer
        pointer = pointer.next
        current++
    }

    if pointer == ll {
        ll = ll.next // this line is problematic
        pointer = nil
    } else {
        if pointer.next == nil {
            pointerPrev.next = nil
        } else {
            pointerPrev.next = pointer.next
            pointer = nil
        }
    }

    return nil
}

有没有建议我如何在不返回新的LinkedList指针的情况下实现这种删除方式?

推荐答案

所有内容都是作为副本传递的,因此只有在传递指向它的指针并修改指向它的值时,才能对其进行更改.

因此,如果不返回新的列表头(必须在调用者处分配),就无法执行所需操作.

另一种方法是传递头指针的地址(类型为**LinkedList),这很难看(必须始终传递头指针的地址).您还可以添加一个单独的方法来删除第一个元素,比如RemoveFirst(),所以您只需要传递给这个方法.这个RemoveFirst()也可以返回新的头,调用者必须分配新的头.这也可以是一个"常规"函数,而不是一个方法.

另一种方法是为列表创建一个包装器,其中包含指向头部的指针.并且在包装器上实现方法,而不是在 node 类型上.包装器的一种方法可以改变包含头指针的字段.

见相关:Can the pointer in a struct pointer method be reassigned to another instance?

Go相关问答推荐

gorm如何声明未自动更新的unix时间戳米尔斯字段

如何使用Promela建模语言对Golang RWLock进行建模

如何在S汇编器中更高效地将全局数据加载到霓虹灯寄存器?

无法在32位计算机上运行Golang应用程序

Date.Format正在输出非常奇怪的日期

如何在gofiber/websocket/v2中设置状态代码和原因

死锁 - 所有 goroutine 都处于睡眠状态(即使使用等待组)

Golang telegram 机器人

从给定顶点查找图形中所有闭合路径的算法

golang:解组动态 YAML 注释

泛型:实现嵌套接口

Golang代码判断第一个词是否可以从第二个词形成

在嵌套模板中使用变量,它也被定义为 go 模板中的变量?

在 Go 模板中对照片使用随机 Int

无法使用 Golang 扫描文件路径

golang pic.ShowImage 为什么它不生成图像而是向我发送base64值

Golang Getrlimit 返回与 ulimit 不同的值

将 Simple Go Web 应用程序部署到 Elastic Beanstalk

如何从字符串中删除多个换行符`\n`但只保留一个?

如何访问 Go 模板中数组的第一个索引的值