You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Go的container/list构建邻接表遇空指针错误,求结构指导

Go邻接表构建问题解答

错误原因

你遇到的panic是因为map中对应节点的*list.List指针未初始化。make(map[int]*list.List, 7)仅初始化了map的容量,但map内每个键(如节点1、2、3)对应的List指针默认都是nil,调用PushBack时会触发nil指针引用的panic。另外原代码中AddEdge函数传递的是SocialGraph值类型,修改的是副本,主函数内的图结构不会被实际更新。

修正后的代码

package main

import (
    "container/list"
    "fmt"
)

type SocialGraph struct {
    V int
    Arr map[int]*list.List
}

// 传递指针类型,确保修改作用于原对象
func AddEdge(g *SocialGraph, i, j int, undir bool) {
    // 初始化节点i的邻居列表(如果不存在)
    if g.Arr[i] == nil {
        g.Arr[i] = list.New()
    }
    g.Arr[i].PushBack(j)
    
    if undir {
        // 初始化节点j的邻居列表(如果不存在)
        if g.Arr[j] == nil {
            g.Arr[j] = list.New()
        }
        g.Arr[j].PushBack(i)
    }
}

func PrintEdgeList(g *SocialGraph) {
    for i := 1; i <= g.V; i++ { // 节点从1到6,无需遍历0
        fmt.Printf("节点%d的邻居:", i)
        if g.Arr[i] != nil {
            for e := g.Arr[i].Front(); e != nil; e = e.Next() {
                fmt.Printf("%d ", e.Value.(int))
            }
        }
        fmt.Println()
    }
}

func main() {
    graph := SocialGraph{V: 6, Arr: make(map[int]*list.List, 7)}
    AddEdge(&graph, 1, 3, true)
    AddEdge(&graph, 2, 3, true)
    AddEdge(&graph, 2, 4, true)
    AddEdge(&graph, 1, 5, true)
    AddEdge(&graph, 1, 6, true)

    PrintEdgeList(&graph)
}

类型选择说明

  • map[int]*list.List是正确的选择:每个节点对应一个邻居链表,*list.List是链表的指针,能直接调用链表的操作方法(如PushBack),符合邻接表的结构需求。
  • map[int][]list.List是错误的:这表示每个节点对应链表的切片,完全不符合邻接表“一个节点对应一个邻居列表”的逻辑,属于结构设计错误。

内容的提问来源于stack exchange,提问作者Newt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 20:37:45