public LinkedList<Node> findPath()
  {  
    DijkstraNode current, start = map_[start_.x][start_.y] , 
        goal = map_[goal_.x][goal_.y];
    
    start.setGScore(0); // setting  the g score of the start to zero
         
    while(!open_list_.isEmpty())
    {
      current = lookingForBestNode(); // get node with lowest f Costs from open list   
      
      if (current.equals(goal)) // found goal
        return constructPath(current);
      
      open_list_.remove(current); // delete current node from open list
      
      LinkedList<DijkstraNode> adjacent_nodes = new LinkedList<DijkstraNode>();

      ArrayList<Node> edges = current.getNode().getEdges();
      if(edges != null)
      {
        for (int idx = 0, size = edges.size(); idx<size; ++idx)
        {
          DijkstraNode current_edje = map_[edges.get(idx).getPosition().x][edges.get(idx).getPosition().y];
          if(!current_edje.isObstacle())
          {
            adjacent_nodes.add(current_edje);
          }
        }
      }
           
      for (int idx = 0, size = adjacent_nodes.size(); idx<size; ++idx)
      {
    	DijkstraNode current_adj = adjacent_nodes.get(idx);
        // costs from current node are cheaper than previous costs
        if(current_adj.getGScore()>(current.getGScore() + COST)) 
        {
          current_adj.setParentNode(current); // set current node as previous for this node
          current_adj.setGScore(current.getGScore() + COST); // set g costs of this node (costs from start to this node)
        }
      }
    }
    
    return null;
  }