0

0

Go 中使用 container/list 传递链表并实现两数相加的完整教程

霞舞

霞舞

发布时间:2026-01-09 14:43:19

|

623人浏览过

|

来源于php中文网

原创

Go 中使用 container/list 传递链表并实现两数相加的完整教程

本文详解如何在 go 中正确使用 container/list 类型,包括函数参数传递、遍历操作及类型断言,并以“两数相加”算法题为实战示例,修正常见语法与逻辑错误。

在 Go 中,container/list 并非内置集合类型(如 slice 或 map),而是一个标准库提供的双向链表实现,其核心类型是 *list.List,而非 list 本身。初学者常因混淆模块名与类型名、忽略 Go 的变量声明语法(类型后置)、误用指针或未做类型断言而报错。下面从基础到实践系统讲解。

✅ 正确导入与类型声明

"container/list" 是包路径,其中导出的类型是 list.List,因此函数参数和返回值必须显式使用 *list.List(推荐传指针,避免复制整个结构体):

func addTwoNumbers(l1 *list.List, l2 *list.List) *list.List {
    // ...
}

⚠️ 错误写法(如 func addTwoNumbers(l1 list, l2 list))会导致编译失败:undefined: list —— 因为 list 不是类型,list.List 才是。

✅ 遍历链表:操作 Element,而非 List

*list.List 本身不支持索引或直接取值;需通过 Front() 获取首节点(*list.Element),再用 .Next() 迭代。每个 Element 的 Value 字段是 interface{} 类型,必须显式断言才能参与数值运算:

Speech Studio
Speech Studio

微软语音服务,提供语音到文本、文本到语音和语音翻译功能。

下载
if e1 != nil {
    sum += e1.Value.(int) // 安全前提:确保所有元素均为 int
    e1 = e1.Next()
}

若数据类型不确定,建议使用类型断言+判断(v, ok := e.Value.(int))提升健壮性。

✅ 完整可运行示例(两数相加)

以下代码修复了原问题中所有关键错误:语法格式、类型声明、遍历逻辑与边界处理:

package main

import (
    "container/list"
    "fmt"
)

func main() {
    // 构造输入:(2 -> 4 -> 3) 和 (5 -> 6 -> 4),注意题目要求逆序存储 → 实际存为 [4,5,2] 和 [4,6,5]
    l1 := list.New()
    l1.PushBack(2) // 个位
    l1.PushBack(4) // 十位
    l1.PushBack(3) // 百位

    l2 := list.New()
    l2.PushBack(5)
    l2.PushBack(6)
    l2.PushBack(4)

    result := addTwoNumbers(l1, l2)

    // 打印结果(逆序输出即为正确答案)
    for e := result.Front(); e != nil; e = e.Next() {
        fmt.Print(e.Value, " ")
    }
    fmt.Println() // 输出:7 0 8
}

func addTwoNumbers(l1, l2 *list.List) *list.List {
    carry := 0
    result := list.New()

    e1, e2 := l1.Front(), l2.Front()
    for e1 != nil || e2 != nil || carry > 0 {
        sum := carry
        if e1 != nil {
            sum += e1.Value.(int)
            e1 = e1.Next()
        }
        if e2 != nil {
            sum += e2.Value.(int)
            e2 = e2.Next()
        }
        result.PushBack(sum % 10)
        carry = sum / 10
    }

    return result
}

? 关键注意事项总结

  • 不要传递 list 模块名:始终使用 *list.List 作为参数/返回类型;
  • Go 变量声明无 int 前缀:写 carry := 0,而非 int carry = 0;
  • 循环条件更简洁:用 for e1 != nil || e2 != nil || carry > 0 替代无限循环 + break;
  • 类型安全第一:Value 是 interface{},务必断言(如 .Value.(int))或用 switch v := e.Value.(type) 处理多类型;
  • 性能提示:container/list 在频繁插入/删除中间节点时有优势,但随机访问或简单列表场景,优先考虑 []int + slice 操作,更高效且直观。

掌握 container/list 的正确用法,不仅能解决算法题,也为构建复杂数据结构(如 LRU Cache)打下坚实基础。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

299

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

220

2025.10.31

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

527

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

408

2024.03.13

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

117

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

255

2025.10.24

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

186

2025.07.04

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

3

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.5万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号