Aslında yapraam okulda bana derste öğretilen sırayla konuları buraya yazmak istiyordum ama. Finallere az kaldı ve anlayamadığım çok konu var. O yüzden önemli konuları öne aldım. Daha sonra daha önemsiz olan konuları burda yazıcam. Yani sonuçta data structures and algorithms dersinde ne öğrendiysem burda yazmış olacağım ama sırasız şekilde olucak.
Bugün sizlere benim ciddi şekilde anamı ağlatan linked list yapısından söz edicem. Nedir linked list ?
Şöyle, linked list içinde aynı arrayde olduğu gibi veri depolarız ve ordan çağırırız fln. Ama linked list arrayden biraz daha farklıdır.
Mesela ;
Mesela ;
- Array'in aksine kapasite sorunu yaşamazsın.
- Array'in aksine birden fazla veri türünü depolayabilirsin
- linked listte araya eleman ekleme,silme,vs daha hızlıdır
- sıralama muhabbeti daha hızlıdır.
gibi gibi..
- Linked list mantığı -
Array içinde veri saklıyorsak. Array içindeki her elemanın bir sırası vardır. ve ordan sırayla çağırırız. Ama linked list içinde mantık tamamen farklıdır. Linked listte her eleman kendinden sonrakine bağlıdır. Şimdi tabi aklınıza nasıl ne alaka amk gibi sorular geliyordur. Ama aydınlatıcam merak etmeyin. Bir resimle sizi aydınlatmaya çalışayım;
Buraki örnek son derece basit bir linked list örneği, sadece numara ve isim değişkeni tutuyoruz.Bir grubumuz olduğunu düşünün ve her yeni kayıda sıradaki numarayı verdiğimizi düşünün.
Linked listte verilerini tuttuğumuz elemana node (düğüm) adını veririz. Mesela yukarıdaki resimde bir node içinde nelerimiz var;
- int no // kişinin numarasını tutuyor
- int name // kişinin adını tutuyor
- next // burdada bir sonraki node'un adresini tutuyor
Gençler!! Burdaki önemli nokta, Her node hafızada bir yere koyulur ve ordan çağırılır. mesela head yani ilk node'umuz hafızada ID21 adında bir yerde duruyor. sonra geçici bir p objesi oluşturduğumuzu düşünelim. içinde p.no = 1, p.name=ali,p.next = null bulunsun ve p objemizde ID54 içinde olsun mesela, head.next=p dediğimiz zaman, head ID54 içinde bulunan objeye bağlıdır anlamı çıkıyor.
Şimdi yukarıdaki resimde gördüğünüz gibi her eleman kendinden sonrakine bağlı. Burda önemli nokta head'i değiştirmememiz lazım. Çünkü bir elemana ulaşacağımız zaman head'den başlayıp sırayla gidicez. Mesela head'de 1. sıradaki adamın ismi var ve biz 6. sıradaki adamın ismini öğrenmek istiyoruz ozaman zaman, Head'den yani 1 numaradan başlayarak teker teker numaralara bakar ve 6. sıraya geldiği zaman onun içindeki name değişkeninin değerini bize döndürür.
İsterseniz resimdeki muhabbeti koda dökelim biraz daha anlaşılır olsun. Sonra methodlara devam ederiz.
linked listi yazmak için 3 tane farklı class'a ihtiyaç duyuyorum ben;
1. main methodumun olduğu class.
2. node'umun içinde tutacağım veri türlerinin olduğu class
3. linked list'imin ve linked list methodlarının olduğu class.
önce node'umun olduğu class'tan başlayayım muhabbete;
Yukarda gördüğün üzere yapraam, next objesi person olarak tanımlı yani, next içinde name,no ve next var. Bir sonraki adresi tutabilmesi için;
gelelim linked list'imin olduğu class'a ;
Burda head ilk node'umuzu tutacağımız yer. head'den başlayıp next'ine sonra next'tin nextine fln derken last'a kadar gelicez işte. last her eleman eklediğimizde değişecektir dansöz gibi.
birde add methodunu koyim şuraya aynı demo1 class'ı içinde;
Şimdi anlatayım; p adında geçici bir person oluşturuyoruz eklenecek veriyi içinde tutuyor. next'i haliyle null.
Eğer bu linked list'e ekleyeceğimiz ilk elemansa yani head =null ise, linked listimizin ilk elemanıda(head), son elemanıda(last) p'nin içindeki değerdir.
Eğer listeye ekleyeceğimiz ilk eleman değilse (yani head doluysa), Burda önemli bir nokta var,
last.next = p kodunu yazdığımız zaman, head'inde last'ında next'ine ekleme yapar, eğer nextlerinin içindede değerler varsa, null olan next'e kadar gelir ve p'nin içindeki değerleri o next'in içine atar, Nedenini sorarsanız bende bilmiyorum. Ama öğrenicem öğrenince editlerim.
Neyse daha sonrada son elemanı(last) yine gelen p değerine eşitleriz.
Birde listeleme methodunu ekliyim sonra onun üzerinden devam edelim;
Yine birtane geçici tmp adında person oluşturuyoruz ve onu head'e eşitliyoruz. Bunu yapmamızın sebebi head'le oynamamak çünkü listemiz head'den başlıyor ve sanki iple birbirine bağlı gibi gidiyor.
Şu an tmp içinde ilk elemanlar var yani head.no, head.name, head.next. tmp.next'in içinde head.next ve tmp.next.next içindede head.next.next var nse fazla karıştırmayım bunu.
Daha sonra en baştan başlıyoruz işte teker teker node içindeki değerleri yazdırıp methoddan çıkıyoruz.
Main methoduda paylaşayımda sıkıntı yaşamayalım.
Buraya birşey yazmama gerek yok zaten koddan anlarsınız.
Bu muhabbetleri tamamen kaptığınıza eminseniz linked listle ilgili diğer meselelere giricem;
Şimdi iyi amk güzel yaptık bişiler. yukarıdaki kodlarla teker teker elemanların numarasını ve isimlerini yazdırırız. Ama belli bir sırayla yazmaz, ve aynı numarayı tekrar verir. Yani işimiz tam bitmedi. Misal verelim bir grubumuz var ve grup içinde herkesin özel bir numarası var, hani Tc kimlik numarası gibi düşünün, birine verilen numarayı başkasına veremeyelim. birde listemiz küçükten büyüğe sıralı olsun.
Linked list bu konuda bize güzel bir katkı sağlar, mesela listede 1.diego ve 7. emre var. Biz 3 numara volkanı eklicez listeye, ozaman linked list'in güzel bir durumu devreye giriyor ve. araya elemanı ekliyor.Tabi methodu kodu fln varda, mantığı şöyle;
İşte resimdede gördüğünüz gibi, sıraya göre araya sokar, no1'i no3'e bağlar no3'de no7'ye bağlar. no3 eklenmeden önce no1, no7'ye bağlıydı. Gerekli kodu atim bakalım;
İlk durumda. Eğer listemizde eleman yoksa ilk elemanı ekleyelim;
Eğer listede eleman yoksa ilk elemanı ekledik. Peki liste doluysa? ozaman işler karışıo amk sıralı koyucaz. aynı sayıdan varsa eklemicez fln fln fln;
Yapraam ekleme muabbetide bu şekilde.
Amk şimdide silmeyi anlatayım. Mesela grubumuzda 4 numaralı elemana uyuz olduk. siktir ettik gruptan ama bilgisayardaki listedende çıkartıp işi resmiyete dökmek istiyoruz. Ozaman yapılacak hareket şöyle;
Yapraam benim yapacaklarım bu kadar. Sonraki derslerde diğer linked list çeşitlerine bakıcaz. Bu anlattığım tek yönlü bağlı listeydi bu arada. Yani eleman sadece kendinden sonrakinin verisini içinde tutuo.