Herkese Merhaba Arkadaşlar.
Java’da dizi boyutunu bilmediğimiz durumlar için ve dizi yerine daha optimize çözümler sunmak için linked list (Bağlı Liste) kullanabiliriz. Bağlı listelerin farklı çeşitleri vardır.
•Tek Yönlü Bağlı Liste
•Çift Yönlü Bağlı Liste
•Dairesel Bağlı Liste
•Dairesel Çift Yönlü Bağlı Liste
Bu yazımızda “Tek yönlü bağlı liste” ele alacağız.
Bağlı listeyi incelemek adına Kitaplık-Kitap ilişkisi içeren bir örneği ele alabiliriz. Kitaplar bizim Düğümlerimiz(Node) Kitaplık ise bizim listemiz olacaktır. Öncelikle Kitaplık sınıfımızı oluşturmamız gerekiyor.
Örneğimiz için ele alacak olursak şu yapıda bir Tek yönlü Bağlı Liste oluşturalım.
•1 adet Sonsuz tane Node içerebilen Kitaplık Sınıfı
• Her bir Kitap için String tipinde bir isim Tutan özellik
Buna göre Kitap sınıfmızı oluşturuyorum.
class Kitap
{
public String veri;
public Kitap sonraki;
public Kitap(String gelenVeri)
{
veri=gelenVeri;
}
public void Yazdir()
{
System.out.println(” “+veri);
}}
Kitap sınıfımızı oluşturduk. Dikkat ederseniz “Tek Yönlü” bir listemiz olduğu için sadece sonraki veriyi tutmak için Kitap tipinde sonraki isimli bir değişken tanımladık. Aynı zamanda İçinde bir adet constructor ve Yazdır fonksiyonu barındıyor. Buna göre birde Kitaplık sınıfımızı oluşturalım. Kitaplık sınıfını oluştururken dikkat etmemiz gereken noktalar var. Çünkü yapacağımız “ekleme, silme,araya ekleme” vb. işlemlerin tamamı Kitaplık sınıfı üzerinde gerçekleşecektir. Bunların tümünü içeren bir kitaplık sınıfı oluşturuyorum.
class Kitaplik
{
private Kitap baslangic=null;
private Kitap son=null;
public void basaEkle(String yeniEleman)
{
Kitap yeniDugum = new Kitap(yeniEleman);
yeniDugum.sonraki=baslangic;
baslangic=yeniDugum;
son=baslangic.sonraki;}
public void sonaEkle(String eleman)
{
Kitap yedek=null;
Kitap gelen = new Kitap(eleman);
son.sonraki=gelen;
yedek=son;
son=gelen;}
public Kitap Bul(String anahtar)
{
Kitap etkin= baslangic;
while(etkin.veri != anahtar)
{
if(etkin.sonraki==null)
{
return null;
}
else
etkin=etkin.sonraki;
}
return etkin;
}
public Kitap Sil(String anahtar)
{
Kitap etkin=baslangic;
Kitap onceki = baslangic;
while(etkin.veri!=anahtar)
{
if(etkin.sonraki==null)
{
return null;
}
else
{
onceki=etkin;
etkin=etkin.sonraki;}
if(etkin==baslangic)
{
baslangic=baslangic.sonraki;
}
else
{
onceki.sonraki=etkin.sonraki;}
}
return etkin;
}public void Listele()
{
System.out.println(“”);
System.out.println(“Bastan Sona Liste: “);
Kitap etkin = baslangic;
while(etkin!=null)
{
etkin.Yazdir();
etkin=etkin.sonraki;
}
}
}
Kitaplık sınıfı için baştan sona fonksiyonları ele alacak olursak:
•Başa Ekle Fonksiyonu
Başa ekleme fonksiyonu için ilk yapmamız gereken şey, listenin boş olup olmama durumudur. Çünkü uygulamada başa ekleme yapacağı zaman listenin bize null dönmesi durumunda önceki başlangıç adresi de null olacağından hata ile karşılaşırız. İlk hareketimiz listenin doluluk kontrolü oluyor ve eğer listemiz boş ise, artık bizim ilk ve son elemanımız başlangıç olarak eklediğimiz eleman oluyor.
Eğer listemiz dolu ise, başa ekleme işlemi için sadece elemanımızın “sonraki” düğümüne başlangıç düğümünü işaretliyoruz ve yeni başlangıç değeri olarak eklediğimiz düğümü seçiyoruz ve ekleme gerçekleşiyor.
•Sona Ekle Fonksiyonu
Sona ekleme fonksiyonunda da aynı başa eklemede olduğu gibi doluluk kontrolü yapıldıktan sonra, eklediğimiz düğümü “son” olarak isimlendirdiğimiz düğümün sonraki değişkenine atayıp, yeni son değişkenini son olarak eklediğimiz değişkene eşitliyoruz.
•Düğüm Bulma İşlemi
Düğüm bulma işleminde listeyi baştan sona taramak için bir “etkin” isimli anahtar düğüm tanımlıyoruz. bu anahtar düğüm vasıtasıyla başlangıç düğümünden itibaren, ana programdan bize gönderilen keyword’ u aratıyoruz. while döngüsü aracılığıyla her düğümün veri değişkeni inceleniyor ve anahtar değişkeni ile eşit olup olmadığı kontrol ediliyor, arama sonucunda etkin=null olduğu durumda listedeki eleman saysı bitmiş ve eleman bulunamamış oluyor. Aksi durumda etkin isimli arama düğümü istediğimiz değişkeni bulduğu esnada o değişkene eşit oluyor.
•Düğüm Silme İşlemi
Öncelikle Düğüm Bulma işlemi ile aynı bir işlem uygulanıyor silinmesi istenen düğüm öncelikle bulunuyor ve belirleniyor. Daha sonra, kendinden önceki düğümün “sonraki” etiketi, bulunan düğümün “sonraki” etiketine eşitleniyor, böylece program artık o düğümü atlamış oluyor. Yani silinmesi istenen düğüm aslında silinmiyor o listede atlanıyor ve boşta kalan düğüm GC tarafından toplanıyor.
•Listeleme Fonksiyonu
Her bir düğümü tek tek taraması gereken “etkin” isimli bir düğüm tanımlanıyor ve başlangıç düğümüne eşitleniyor. while döngüsü aracılığıyla etkin isimli düğüm her bir düğümü tarayıp, içindeki “veri” değişkenini yazdırıyor ve sonrakine geçiyor. İşlem etkin isimli düğüm “null” olana kadar devam ediyor.
Tek yönü bağlı liste için bahsedeceklerim bu kadar arkadaşlar. Eğer takıldığınız yer veya yaşadığınız sorun olursa bu başlık altından sorularınızı sorabilirsiniz.
Teşekkür ederim.
Listele metodunda Dugum etkin=baslangic; diye bir tanımlama var. Dugum diye bir sınıf yok ki.
Kitap etkin=baslangic; olması gerekiyor.
Evet, ufak bir dalgınlık olmuş. Belirttiğiniz için teşekkür ederim. Düzelttim.