public List<Tile> findPath() {
   MazeTileNode lastNode = run();
   if (isTarget(lastNode)) {
     // Reconstruct path
     List<MazeTileNode> nodePath = reconstructPath(lastNode);
     // Create list of tiles
     List<Tile> path = new LinkedList<Tile>();
     for (MazeTileNode node : nodePath) {
       path.add(node.getTile());
     }
     return path;
   } else {
     // No path found
     return null;
   }
 }
 @Override
 public boolean isValidNode(MazeTileNode node) {
   return tileValidator.apply(node.getTile());
 }
 @Override
 public boolean isTarget(MazeTileNode node) {
   return node != null && node.equals(getTarget());
 }
 @Override
 protected boolean canHaveAsTarget(MazeTileNode target) {
   return super.canHaveAsTarget(target) && target.getMaze() == getMaze();
 }