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

如何将有向图转为无向图?修改addEdge方法实现双向邻接

实现无向图的双向边添加修改方案

要把你的图改成无向图,只需要修改Node类里的addEdge方法,在添加目标节点到当前节点邻接表的同时,把当前节点也加入目标节点的邻接表就行。

基础修改版本

直接修改addEdge方法,添加双向关联:

public void addEdge(Node node) {
    edge.add(node);
    // 把当前节点加入目标节点的邻接表,实现双向边
    node.edge.add(this);
}

不过这里有个小问题:如果重复调用n1.addEdge(n2),会导致两边的邻接表都重复添加节点。如果需要避免重复,可以加个存在性检查:

带去重的优化版本

public void addEdge(Node node) {
    // 检查当前节点的邻接表是否已有目标节点,没有才添加
    if (!edge.contains(node)) {
        edge.add(node);
        // 同样检查目标节点的邻接表是否已有当前节点,避免重复添加
        if (!node.edge.contains(this)) {
            node.edge.add(this);
        }
    }
}

完整修改后的代码

public class Main {

    public static void main(String[] args) {

        Graph g = new Graph();
        Node n1 = new Node("A");
        Node n2 = new Node("B");
        Node n3 = new Node("C");
        Node n4 = new Node("D");
        n1.addEdge(n2);
        n2.addEdge(n3);
        n3.addEdge(n4);
        n4.addEdge(n1);

    }
}

class Node{
    String node;
    boolean isVisited;
    LinkedList<Node> edge;

    Node(String node){
        this.node = node;
        edge = new LinkedList<>();
    }

    public void addEdge(Node node){
        // 带去重的双向边添加逻辑
        if (!edge.contains(node)) {
            edge.add(node);
            if (!node.edge.contains(this)) {
                node.edge.add(this);
            }
        }
    }

    public LinkedList<Node> getEdge(){
        return edge;
    }
}

class Graph {
    // 可根据需求补充节点管理、图遍历等逻辑
}

这样修改后,每次调用addEdge都会同时在两个节点的邻接表里互相添加,实现无向图的特性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:45:42