go语言
单链表删除节点:指针传递与值修改详解
本文深入探讨Go语言单链表删除节点操作中指针传递的问题,解释为什么直接修改指针无法改变链表结构,并提供正确的解决方案。
问题:直接修改指针无效
Go语言函数参数采用值传递机制。即使参数是指针类型,传递的也是指针值的副本,而非指针本身。以下代码片段演示了这个问题:
函数试图删除链表首节点。然而,
仅修改了函数内部局部变量
的值,原始链表结构并未改变。
函数中的
变量仍然指向原首节点。
立即学习
“
go语言免费学习笔记(深入)
”;
解决方案:返回修改后的指针
go语言参考手册 中文CHM版
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译
下载
为了正确修改链表结构,
函数需要返回修改后的链表头指针:
函数需要重新赋值
变量:
通过返回并重新赋值,
变量才能正确指向更新后的链表头。
总结
理解Go语言指针传递机制和函数参数的局部性对于正确编写链表操作至关重要。 直接修改函数内接收到的指针副本并不能改变外部变量的值,必须通过返回修改后的指针并重新赋值来更新链表结构。
type linklist struct {
next *linklist
data interface{}
}
func newnodelist(value interface{}) *linklist {
return &linklist{data: value, next: nil}
}
func (l *linklist) delete(index int) {
if index == 0 {
l = l.next // 仅修改局部副本
}
}
func main() {
list := newnodelist(1)
list.delete(0) // list 未被修改
}deletel = l.nextlmainlistdeletefunc (l *linklist) delete(index int) *linklist {
if index == 0 {
l = l.next
}
return l
}mainlistfunc main() {
list := newnodelist(1)
list = list.delete(0) // 关键:重新赋值
}list