public final Pino etsiPolku(int alkuX, int alkuY, int loppuX, int loppuY) {      
      
      kaymattomatNoodit = new PriorityQueue<Noodi>(11, noodiVertailija);                
      kaydytNoodit = new LinkedList<T>();
      kaymattomatNoodit.add(noodit[alkuX][alkuY]);

      valmis = false;
      T valittu;
      while (!valmis) {
          /** Haetaan läpikäymättömistä noodeista lyhimmän matka-arvion omaava */
          valittu = (T)lyhinMatkaLapikaymattomissa(); 
          /** Lisätään noodi läpikäytyihin ja poistetaan -käymättömistä */
          kaydytNoodit.add(valittu); 
          kaymattomatNoodit.remove(valittu);          

          /** Onko piste loppupiste? */
          if ((valittu.getxPositio() == loppuX)
                  && (valittu.getyPositio() == loppuY)) { 
              return laskePolku(noodit[alkuX][alkuY], valittu);
          }

          // Käytään läpi kaikki viereiset Noodit
          List<T> viereisetNoodit = getViereinen(valittu);
          for (int i = 0; i < viereisetNoodit.size(); i++) {
              T valittuViereinen = viereisetNoodit.get(i);
              if (!kaymattomatNoodit.contains(valittuViereinen)) {
                  asetaKaymatonNoodi(kaymattomatNoodit, valittuViereinen, valittu, loppuX, loppuY);
              } else {
                  /** Jos matka käsittelyssä olevan Noodin kautta on lyhyempi kuin Noodiin aiemmin tallennettu matka,
                   aseta käsittelyssä oleva Noodi edeltäjäksi ja päivitä matkaa */                  
                  asetaUusiLyhinMatka(valittuViereinen, valittu);
              }
          }

          if (kaymattomatNoodit.isEmpty()) { 
              return new Pino(10);
          }
      }
      return null;
  }