The Graph Class

package graph;

import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 * This class represents directed and undirected graphs of vertices.
 * Graphs are internally represented using adjacency lists.
 * @author tcolburn
 */
public class Graph {

    /**
     * Constructs a new graph given lists of vertices and edges.
     * @param vertices A list of graph vertices
     * @param edges A list of graph edges
     * @param directed Whether the graph is directed or not
     */
    public Graph(List<Vertex> vertices, List<Edge> edges, boolean directed) {

        this.vertices = vertices;
        this.directed = directed;
        adj_hash = new Hashtable<Vertex, List<Vertex>>();
        Iterator<Vertex> vertexIterator = vertices.iterator();
        while ( vertexIterator.hasNext() ) {
            Vertex v = (Vertex) vertexIterator.next();
            adj_hash.put(v, new LinkedList<Vertex>());
        }
        Iterator<Edge> iter = edges.iterator();
        while (iter.hasNext()) {
            Edge e = iter.next();
            addEdge(e.getV1(), e.getV2());
        }
    }

    /**
     * Adds an edge (v1, v2) to this graph.
     * If the graph is undirected, (v2, v1) is also added.
     * @param v1 The first vertex in the edge
     * @param v2 The second vertex in the edge
     */
    private void addEdge(Vertex v1, Vertex v2) {
        adj_hash.get(v1).add(v2);
        if (!directed) {
            adj_hash.get(v2).add(v1);
        }
    }

    /**
     * Tests whether a pair of vertices forms an edge in this graph.
     * @param vertex1 The first vertex
     * @param vertex2 The second vertex
     * @return Whether there is an edge from the first vertex to the second
     */
    public boolean isEdge(Vertex vertex1, Vertex vertex2) {
        return adj_hash.get(vertex1).contains(vertex2);
    }

    /**
     * Accessor for a list of vertices making up this graph.
     * @return A list of vertices
     */
    public List<Vertex> getVertices() {
        return vertices;
    }

    /**
     * Creates a string representation of this graph's adjacency list for testing.
     * @return The string representation of the adjacency list
     */
    public String toString() {
        StringBuffer buffer = new StringBuffer();
        Iterator vertexIterator = vertices.iterator();
        while ( vertexIterator.hasNext() ) {
            Vertex vertex = (Vertex) vertexIterator.next();
            buffer.append("\n" + vertex.getName());
            List<Vertex> adjList = adj_hash.get(vertex);
            if ( adjList == null ) continue;
            Iterator listIterator = adjList.iterator();
            while ( listIterator.hasNext() ) {
                Vertex adjVertex = (Vertex) listIterator.next();
                buffer.append(" -> " + adjVertex.getName());
            }
        }
        return buffer.toString();
    }

    /**
     * Whether this graph is directed or not.
     */
    private boolean directed;

    /**
     * The vertex's adjacency lists are stored in a hash table whose
     * keys are vertices and whose values are lists of vertices.
     */
    private Hashtable<Vertex, List<Vertex>> adj_hash;

    /**
     * A list of vertices in this graph.  This list is necessary because a
     * vertex may not get into the hash table if there is no edge from it.
     */
    private List<Vertex> vertices;

}