我正在尝试为字符图形实现拓扑排序。
这是我的代码。
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。任何帮助表示赞赏。
答案 0 :(得分:0)
您的程序在topSortUtil
时崩溃,因为LinkedList<Character> list = adjList.get(key);
时正在调用key='d'
。由于d
没有外向边,list
为null
,所以当您到达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);
}