public CrossingStructure findPath(Crossing start, Crossing end, int limit) {
        closedList = new ArrayList<CrossingStructure>();
        openList = new ArrayList<CrossingStructure>();
        CrossingStructure current = new CrossingStructure(start, null);

        current.setgScore(0).sethScore( heuristic.calculateHScore(start, end) );
        current.setParentStep(-1);
        addToOpen(current);

        while(!openList.isEmpty()) {
            current = openList.get(0);

            openList.remove(current);
            closedList.add(current);

            if( current.getCrossing().equals( end ) || (limit > 0 && current.getParentStep() == limit) ) {
                return current;
            }

            for(Vertex v : current.getCrossing().getNeighbours()) {
                CrossingStructure neighbour = new CrossingStructure( (Crossing) v );

                if( findInList(closedList, neighbour.getCrossing()) != null ) {
                    continue;
                }

                CrossingStructure found = findInList(openList, neighbour.getCrossing() );
                double gScore = current.getgScore() + current.getCrossing().calcualteDistance( neighbour.getCrossing() );

                if( found == null) {
                    neighbour.setgScore( gScore );
                    neighbour.sethScore( neighbour.getCrossing().calcualteDistance(end) );
                    neighbour.setParent( current.getCrossing() );
                    neighbour.setParentStep( current.getParentStep() + 1 );

                    addToOpen(neighbour);
                } else if( gScore < found.getgScore() ) {
                    found.setParent( current.getCrossing() );
                    found.setgScore( gScore );
                    found.setParentStep( current.getParentStep() + 1 );

                    Collections.sort(openList);
                }
            }
        }

        if(limit == -1)
            System.out.println("Path not found!");

        return null;
    }