Golang中链表相关的查询问题
Golang中链表相关的查询问题 在这里找到了这段代码
func (l *LinkedList) Insert(val int) {
n := Node{}
n.value = val
if l.len == 0 {
l.head = &n
l.len++
return
}
ptr := l.head
for i := 0; i < l.len; i++ {
if ptr.next == nil {
ptr.next = &n
l.len++
return
}
ptr = ptr.next
}
}
我想知道这里的 (l *LinkedList) 表示什么含义。
更多关于Golang中链表相关的查询问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
5 回复
这意味着 Insert 是 *LinkedList 的一个方法。l 是“接收者”。Go 语言之旅
这些是每种情况下的多重赋值。例如,
c.Next, l2 = l2, l2.Next
将 l2 赋值给 c.Next,并将 l2.Next 赋值给 l2。
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
m := &ListNode{}
for c := m; l1 != nil || l2 != nil; c = c.Next {
switch {
case l1 == nil: c.Next, l2 = l2, l2.Next
case l2 == nil: c.Next, l1 = l1, l1.Next
case l2.Val > l1.Val: c.Next, l1 = l1, l1.Next
default: c.Next, l2 = l2, l2.Next
}
}
return m.Next
}
能否请你解释一下 l1=l1 和 l2=l2 是什么意思
(l *LinkedList) 是 Go 语言中的方法接收器(method receiver),它表示这个 Insert 方法属于 LinkedList 类型。具体来说:
l:是接收器变量的名称(通常使用类型的首字母小写)*LinkedList:表示这是一个指针接收器,方法内部对l的修改会影响原始对象
关键点解析:
// 值接收器(副本操作)
func (l LinkedList) Insert(val int) { ... }
// 指针接收器(直接操作原对象)<- 你示例中的类型
func (l *LinkedList) Insert(val int) { ... }
示例对比:
type LinkedList struct {
head *Node
len int
}
// 指针接收器版本(正确)
func (l *LinkedList) Insert(val int) {
// 这里修改 l.head 或 l.len 会影响原始链表
if l.len == 0 {
l.head = &Node{value: val} // 直接修改原对象
l.len++
}
}
// 值接收器版本(错误)
func (l LinkedList) Insert(val int) {
// 这里修改的是链表的副本,原链表不受影响
if l.len == 0 {
l.head = &Node{value: val} // 只修改副本
l.len++ // 副本的len改变
}
// 函数返回后副本被丢弃,原链表保持不变
}
实际调用示例:
list := &LinkedList{} // 创建链表指针
list.Insert(10) // 调用指针接收器方法
// Go 会自动将 list 转换为 (*list).Insert(10)
// 等价于:
(*list).Insert(10) // 显式调用
为什么链表操作必须用指针接收器:
func main() {
var list LinkedList
list.Insert(1) // Go 自动取地址:(&list).Insert(1)
// 如果 Insert 使用值接收器:
// 1. 创建 list 的副本
// 2. 在副本上插入节点
// 3. 副本被丢弃,原 list 仍然是空的
}
指针接收器在需要修改接收器状态(如修改链表头指针、更新长度字段)时是必须的。对于链表这种数据结构,99% 的方法都应该使用指针接收器。

