Derse geri dön

Tek-bağlı(single-linked) List'in çıktısı

önem: 5

Aşağıdaki gibi bir tane tek-bağlı ( Kendini tekrarlayan ( özçağrı ) ve yığın’da gösterildiği gibi) liste olsun:

let list = {
  deger: 1,
  sonraki: {
    deger: 2,
    sonraki: {
      deger: 3,
      sonraki: {
        deger: 4,
        sonraki: null
      }
    }
  }
};

listeYaz(list) adında bir fonksiyon yazın ve bu tüm liste elemanlarını birer birer ekrana bassın.

Hem döngü hem de özçağrı kullanan versiyonlarını yazınız.

Hangisi daha iyidir: özçağrı ile mi yoksa döngü ile mi?

Döngü-tabanlı Çözüm

Döngü tabanlı çözüm aşağıdaki gibidir:

let list = {
  deger: 1,
  sonraki: {
    deger: 2,
    sonraki: {
      deger: 3,
      sonraki: {
        deger: 4,
        sonraki: null
      }
    }
  }
};

function listeYaz(list) {
  let tmp = list;

  while (tmp) {
    alert(tmp.deger);
    tmp = tmp.sonraki;
  }

}

listeYaz(list);

Dikkat ederseniz tmp adında geçici bir değişken tutarak listeni üzerinden geçildi. Bunun yerine list fonksiyon parametresi de kullanılabilir:

function listeYaz(list) {

  while(list) {
    alert(list.deger);
    list = list.sonraki;
  }

}

… Fakat çok akıllıca bir yöntem değil. İleride fonksiyonu genişletmek gerekebilir. Liste ile bir şeyler yapmak gerekebilir. Eğer list değişirse bu gerekliliklerin hiçbiri yerine getirilemez.

Değişken isimlerinden konuşmak gerekirse list burada liste’nin kendisidir, ilk elemanıdır ve öyle kalmalıdır. Temiz ve güvenilir.

Diğer taraftan tmp liste için aynı i'nin for için gerekliliği gibidir.

Öz çağrı çözümü

listeYaz(list)'in öz çağrı çözümü şu mantığa dayanır: Liste’nin çıktısını almak için o anki list elemanının çıktısı basılmalıdır. Sonra diğer list.sonraki elemanlarının yapılmalıdır.

let list = {
  deger: 1,
  sonraki: {
    deger: 2,
    sonraki: {
      deger: 3,
      sonraki: {
        deger: 4,
        sonraki: null
      }
    }
  }
};

function listeYaz(list) {

  alert(list.deger); // elemanın çıktısını bas

  if (list.sonraki) {
    listeYaz(list.sonraki); // listenin geri kalan elemanları için de aynısını yap
  }

}

listeYaz(list);

Hangisi daha iyi?

Teknik olarak döngü versiyonu daha etkilidir. İki yöntem de aynı işi yapar, fakat döngü versiyonu iç içe fonksiyonlar için kaynak harcamaz.

Diğer taraftan özçağrı versiyonu daha kısa ve bazen anlaşılması daha kolaydır.