Java中的拓扑排序

时间:2016-02-17 15:53:50

标签: java graph topological-sort

我正在尝试为字符图形实现拓扑排序。

这是我的代码。

public class Graph {

    private int vertices;
    private HashMap<Character, LinkedList<Character>> adjList;
    private boolean isDirected;

    public Graph(int vertices){
        this.vertices = vertices;
        adjList = new HashMap<>();
        isDirected = true;
    }

    public void addEdge(Character from, Character to){

        if(adjList.containsKey(from)){
            LinkedList<Character> l = adjList.get(from);
            l.add(to);
        }else{
            LinkedList l = new LinkedList();
            l.add(to);
            adjList.put(from, l);
        }
    }

    public Deque<Character> topologicalSort(){
        Deque<Character> stack = new ArrayDeque<>();
        Set<Character> visited = new HashSet<>();
        Iterator itr = adjList.entrySet().iterator();
        while(itr.hasNext()){
            Map.Entry pair = (Map.Entry) itr.next();
            LinkedList<Character> l = (LinkedList<Character>) pair.getValue();
            ListIterator<Character> litr = l.listIterator();
            while(litr.hasNext()){
                Character key = (Character)litr.next();
                if(visited.contains(key)) continue;
                else{
                    topSortUtil(key, stack, visited);

                }
            }
        }
            return stack;

    }

    public void topSortUtil(Character key, Deque<Character> stack, Set<Character> visited){
        visited.add(key);
        LinkedList<Character> list = adjList.get(key);
        ListIterator<Character> litr = list.listIterator();
        while(litr.hasNext()){
            Character childKey = (Character) litr.next();
            if(visited.contains(childKey)) continue;
            else topSortUtil(childKey,stack, visited);
        }
        stack.offerFirst(key);
    }




}

我用来测试的客户端代码如下,

public class Main {

    public static void main(String[] args) {
    // write your code here

        Graph graph = new Graph(5);
        graph.addEdge('a', 'b');
        graph.addEdge('a', 'c');
        graph.addEdge('a', 'd');
        graph.addEdge('b', 'd');
        graph.addEdge('b', 'e');
        graph.addEdge('c', 'e');

        Deque<Character> stack = graph.topologicalSort();
        while(!stack.isEmpty()){
            System.out.print(stack.pop() + " ");
        }
    }
}

问题是我在控制台上没有输出任何内容。似乎无法弄清楚这是什么bug。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

您的程序在topSortUtil时崩溃,因为LinkedList<Character> list = adjList.get(key);时正在调用key='d'。由于d没有外向边,listnull,所以当您到达ListIterator<Character> litr = list.listIterator();行时,您正在调用null上的方法,抛出NullPointerException

答案 1 :(得分:0)

将您的topSortUtil方法更改为类似<=>

的方法
public void topSortUtil(Character key, Deque<Character> stack, Set<Character> visited){
    visited.add(key);
    ListIterator<Character> litr ;

    LinkedList<Character> list = adjList.get(key);
    if(list!=null) //null check
    {
    litr = list.listIterator();

    while(litr.hasNext()){
        Character childKey = (Character) litr.next();
        if(visited.contains(childKey)) continue;
        else topSortUtil(childKey,stack, visited);
    }
    }

    stack.offerFirst(key);
}