void (VarVersionNode root, List<? super VarVersionNode> lst, Set<? super VarVersionNode> setVisited) { Map<VarVersionNode, List<VarVersionEdge>> mapNodeSuccs = new HashMap<>(); LinkedList<VarVersionNode> stackNode = new LinkedList<>(); LinkedList<Integer> stackIndex = new LinkedList<>(); stackNode.add(root); stackIndex.add(0); while (!stackNode.isEmpty()) { VarVersionNode node = stackNode.getLast(); int index = stackIndex.removeLast(); setVisited.add(node); List<VarVersionEdge> lstSuccs = mapNodeSuccs.computeIfAbsent(node, n -> new ArrayList<>(n.successors)); for (; index < lstSuccs.size(); index++) { VarVersionNode succ = lstSuccs.get(index).dest; if (!setVisited.contains(succ)) { stackIndex.add(index + 1); stackNode.add(succ); stackIndex.add(0); break; } } if (index == lstSuccs.size()) { lst.add(0, node); stackNode.removeLast(); } } }