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 回复

感谢你的帮助。

更多关于Golang中链表相关的查询问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这意味着 Insert*LinkedList 的一个方法。l 是“接收者”。Go 语言之旅

这些是每种情况下的多重赋值。例如, c.Next, l2 = l2, l2.Nextl2 赋值给 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=l1l2=l2 是什么意思

(l *LinkedList) 是 Go 语言中的方法接收器(method receiver),它表示这个 Insert 方法属于 LinkedList 类型。具体来说:

  1. l:是接收器变量的名称(通常使用类型的首字母小写)
  2. *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% 的方法都应该使用指针接收器。

回到顶部