ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

十字链表 java

2022-01-06 13:31:22  阅读:116  来源: 互联网

标签:java name int graph 链表 ArcNode 十字 firstOut String


概念

十字链表(Orthogonal List)是有向图的另一种链式存储结构。该结构可以看成是将有向图的邻接表(出度)和逆邻接表(入度)结合起来得到的。用十字链表来存储有向图,可以达到高效的存取效果。

简单的说,十字链表是在邻接表的基础上增加了入度的信息。

例子

其邻接表是

逆邻接表是

那么怎么合并

代码

import java.util.ArrayList;
import java.util.List;

class ArcNode{
    /** 头节点*/
    VertexNode headVec;
    /** 尾节点*/
    VertexNode tailVec;
    int value;
    ArcNode hLink;
    ArcNode tLink;
}
class VertexNode {
    public VertexNode(String name) {
        this.name = name;
    }

    String name;
    int value;
    /**入度*/
    ArcNode firstIn;
    /**出度*/
    ArcNode firstOut;
}
class OrthogonalList{
    int[][] graph;
    List<VertexNode> vertexNodes;

    public OrthogonalList(int[][] graph,String[] names) {
        this.graph = graph;
        this.vertexNodes = buildOrthogonalList(graph,names);
    }
    public List<VertexNode> buildOrthogonalList(int[][] graph,String[] names){
        List<VertexNode> vertexNodes = new ArrayList<>();
        // 因为一个节点有出度必然会有入度,所以我们需要先对其进行初始化
        for(int i=0;i<graph.length;i++){
            vertexNodes.add(new VertexNode(names[i]));
        }
        for(int i=0;i<graph.length;i++){
            for(int j=0;j<graph[0].length;j++){
                if(graph[i][j]==1){
                    //有边,那么我们会开始构建
                    ArcNode arcNode = new ArcNode();
                    arcNode.headVec = vertexNodes.get(i);
                    arcNode.tailVec = vertexNodes.get(j);
                    // i 构建出度
                    buildNodeOutArc(vertexNodes.get(i),arcNode);
                    // j  构建入度
                    buildNodeInArc(vertexNodes.get(j),arcNode);

                }
            }
        }
        return vertexNodes;
    }

    /**
     * 构建入度 尾节点一致
     */
    public void buildNodeInArc(VertexNode vertexNode,ArcNode arcNode){
        if(vertexNode.firstIn==null){
            vertexNode.firstIn = arcNode;
            return;
        }
        ArcNode tempArcNode = vertexNode.firstIn;
        while (tempArcNode.tLink!=null){
            tempArcNode = tempArcNode.tLink;
        }
        tempArcNode.tLink = arcNode;
    }

    /**
     * 构建出度 头节点一致
      */
    public  void buildNodeOutArc(VertexNode vertexNode, ArcNode arcNode){
        if(vertexNode.firstOut==null){
            vertexNode.firstOut = arcNode;
            return;
        }
        ArcNode tempArcNode = vertexNode.firstOut;
        while (tempArcNode.hLink!=null){
            tempArcNode = tempArcNode.hLink;
        }
        tempArcNode.hLink = arcNode;
    }
    /**
     * 打印所有节点的出度和入度
     */
    public void printAllNodeInAndOut(){
        for(VertexNode vertexNode:vertexNodes){
            System.out.println("节点: "+vertexNode.name);
            ArcNode firstIn = vertexNode.firstIn;
            ArcNode firstOut = vertexNode.firstOut;
            System.out.println("入度: ");
            while (firstIn!=null){
                System.out.println(firstIn.headVec.name+"-->"+firstIn.tailVec.name);
                firstIn = firstIn.tLink;

            }
            System.out.println("出度: ");
            while (firstOut!=null){
                System.out.println(firstOut.headVec.name+"-->"+firstOut.tailVec.name);
                firstOut = firstOut.hLink;
            }
        }
    }
}

class testVertexNode{
    public static void main(String[] args) {
        String[] names = {"v1","v2","v3","v4"};
        int[][] graph = {{0,1,1,1},{1,0,0,0},{1,0,0,1},{0,0,0,0}};
        OrthogonalList orthogonalList = new OrthogonalList(graph,names);
        orthogonalList.printAllNodeInAndOut();
    }
}

标签:java,name,int,graph,链表,ArcNode,十字,firstOut,String
来源: https://www.cnblogs.com/jefferyeven/p/15770696.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有