If you are new to graph data structure , read article on graph introduction here.

In this tutorial we will implement a bi-directional graph & uni-directional. We will actually be building an **ADT(Abstract Data Type)** for Graph ,which will host several functional features to be implemented on a graph.

Let’s dive into the code directly:

public class Graph { private final HashMap<Integer,java.util.LinkedList<Integer>> graph; private final boolean IS_DIRECTED; private final int SIZE; public Graph(int N,boolean IS_DIRECTED){ if(N < 0) throw new RuntimeException("SIZE CANNOT BE NEGATIVE"); this.IS_DIRECTED=IS_DIRECTED; this.SIZE=N; graph=new HashMap<>(); for(int i=1;i<=N;i++) graph.put(i,new java.util.LinkedList<>()); } }

In the above code snippet, we have a class Graph with constructor which accepts **integer **argument & **boolean **argument ‘**N**‘ & ‘**IS_DIRECTED**‘ respectively.

Line no **3 **, specifies how are we storing the entire graph ?.

We have used a **HashMap<Integer,LinkedList<Integer>>** to build our graph. HashMap is a data structure which is imported from **java.util** package.

Pictorial Representation of our code is as follows:

At Line No **7**, **Parameterized **constructor does the following thing:

At line No **8**, is a boundary condition for the graph . (graph should have more that one nodes).

At line No **13** , initializes the ‘**N**‘ nodes for a graph, basically adds ‘N’ nodes in our **HashMap<>**.

Let’s now add an important functionality to our ADT, **addEdge()** function helps to construct a graph by adding edges between vertices.

Here’s is the code:-

public void addEdge(int x,int y){ java.util.LinkedList<Integer> list; if(IS_DIRECTED){ list=graph.get(y); list.add(x); graph.put(y, list); } list=graph.get(x); list.add(y); graph.put(x, list); }

**addEdge(int,int)** accepts 2 integer arguments.

What it does is ,

At line no **3**, Checks if the graph is bi-directional or uni-diretional.

This method just updates the linked list by adding x nodes in y adjacency list & vice versa if, the graph is bi-directional.

At last, to print our graph we have **print()** function.

Here is the code:-

public void print(){ for(Map.Entry<Integer,java.util.LinkedList<Integer>> mapped:graph.entrySet()){ System.out.print(" "+mapped.getKey()+"->"); for(int y:mapped.getValue()){ System.out.print(" "+y); } System.out.println(); } }

**print()** function traverses through the **HashMap<>** and prints the corresponding **LinkedList **, vertex by vertex.

We have used **entrySet()** method, to get both keys & values in the graph.

**Keys- are our Integers & Values- are our LinkedList of nodes.**

Putting it all together, we have build a basic ADT for Graph data structure.

Here’s the final code:-

package interview; import java.util.*; public class Graph { private final HashMap<Integer,java.util.LinkedList<Integer>> graph; private final boolean IS_DIRECTED; private final int SIZE; public Graph(int N,boolean IS_DIRECTED){ if(N < 0) throw new RuntimeException("SIZE CANNOT BE NEGATIVE"); this.IS_DIRECTED=IS_DIRECTED; this.SIZE=N; graph=new HashMap<>(); for(int i=1;i<=N;i++) graph.put(i,new java.util.LinkedList<>()); } public void addEdge(int x,int y){ java.util.LinkedList<Integer> list; if(IS_DIRECTED){ list=graph.get(y); list.add(x); graph.put(y, list); } list=graph.get(x); list.add(y); graph.put(x, list); } public void print(){ for(Map.Entry<Integer,java.util.LinkedList<Integer>> mapped:graph.entrySet()){ System.out.print(" "+mapped.getKey()+"->"); for(int y:mapped.getValue()){ System.out.print(" "+y); } System.out.println(); } } }

That’s it for now! , we can also extend our Graph ADT to have more functionalities like **BFS(), DFS(), isConnected() **operations.

Thanks for reading out article!.

Happy coding!.