void (Statement root, List<? super Statement> lst) { LinkedList<Statement> stackNode = new LinkedList<>(); LinkedList<Integer> stackIndex = new LinkedList<>(); HashSet<Statement> setVisited = new HashSet<>(); stackNode.add(root); stackIndex.add(0); while (!stackNode.isEmpty()) { Statement node = stackNode.getLast(); int index = stackIndex.removeLast(); setVisited.add(node); List<StatEdge> lstEdges = node.getAllSuccessorEdges(); for (; index < lstEdges.size(); index++) { StatEdge edge = lstEdges.get(index); Statement succ = edge.getDestination(); if (!setVisited.contains(succ) && (edge.getType() == EdgeType.REGULAR || edge.getType() == EdgeType.EXCEPTION)) { // TODO: edge filter? stackIndex.add(index + 1); stackNode.add(succ); stackIndex.add(0); break; } } if (index == lstEdges.size()) { lst.add(0, node); stackNode.removeLast(); } } }