package com.interview.books.question300; import com.interview.leetcode.utils.GraphNode; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; /** * Created_By: stefanie * Date: 14-12-16 * Time: 下午1:54 */ public class TQ30_CyclePrinter { public void print(List<GraphNode> nodes){ HashSet<GraphNode> visited = new HashSet<>(); for(GraphNode node : nodes){ if(visited.contains(node)) continue; List<GraphNode> path = new ArrayList<>(); HashMap<GraphNode, Integer> indexes = new HashMap(); dfs(node, path, indexes, visited); } } private void dfs(GraphNode node, List<GraphNode> path, HashMap<GraphNode, Integer> indexes, HashSet<GraphNode> visited) { if(indexes.containsKey(node)){ //found a cycle int index = indexes.get(node); while(index < path.size()) System.out.print(path.get(index++).label + ", "); System.out.println(node.label); return; } visited.add(node); indexes.put(node, path.size()); path.add(node); for(GraphNode neighbor : node.neighbors){ dfs(neighbor, path, indexes, visited); } path.remove(node); indexes.remove(node); } public static void main(String[] args){ List<GraphNode> nodes = GraphNode.sampleDirectedGraph(); TQ30_CyclePrinter printer = new TQ30_CyclePrinter(); printer.print(nodes); } }