static List<Vertex> dfs(Graph g, Vertex start) {

        if (g == null) {
            throw new IllegalArgumentException("Input graph must not be null.");
        }

        if (start == null) {
            throw new IllegalArgumentException("Input vertex must not be null.");
        }

        final List<Vertex> returnList = new LinkedList<Vertex>();

        final Stack<Vertex> toVisit = new Stack<Vertex>();
        toVisit.push(start);

        while (!toVisit.isEmpty()) {

            final Vertex current = toVisit.pop();
            returnList.add(current);

            final List<Edge> edges = g.adjacencyList.get(current);

            if (edges != null) {
                for (final Edge e : edges) {
                    if (!toVisit.contains(e.y) && !returnList.contains(e.y)) {
                        toVisit.push(e.y);
                        break;
                    }
                }
            }
        }

        //  For a given node, process it
        //  Take it's first unvisited descendant, insert it and start over

        return returnList;
    }