İçeriğe geç →

C# Linked List (Singly Linked List) nedir?

Merhaba arkadaşlar, bu makalemde sizlerle veri yapılarının bir parçası ve mülakatların ise vazgeçilmez sorusu olan Linked List‘i ve en basiti olan Singly Linked List hakkında bahsedip custom bir örnek yapacağız. 🙂

Nedir bu Linked Lists (Bağlı Listeler)?

Linked List’ler hakkında dinamik veri yapılarıdır desek yanlış olmaz. Çünkü dizilerde olduğu gibi başta kaç adet elemanla çalışacağımızı bildirmek zorunda değiliz ve Linked List içerisinde bellek üzerinde tanımlanan elemanlar göstericiler yardımı ile birbirlerine bağlanarak tıpkı tren vagonları gibi bir liste yapısı oluştururlar.

.Net Framework 4 ile birlikte gelen collections ailesinde  LinkedList generic sınıfı bulunmaktadır ama biz makalemizde custom bir Singly Linked List yapısını inceliyor olacağız mantığını daha iyi kavrayabilmek adına.

Linked List’in bir başlangıcı ve son elemanı vardır. Dizilerde olduğu gibi eleman ekleme, silme işlemleri uygulanabilir ve en güzel avantajı ise araya da yeni bir eleman katılabilir.

Bir başka avantajı ise dizilerde tanımlanmış fazla eleman sayıları örneğin 500 elemanlı bir dizi kullanmak bellek açısından bir maliyeti olacaktır oysa Linked List’te herhangi bir boyut belirtmek zorunda kalmayacağımız için ihtiyacımız olacak şekilde boyutu artacaktır ve bellek açısından daha az maliyetli olacaktır. Linked List’lere herhangi bir eleman ekleme limiti yoktur yada ram’inizin kaldırabileceği kadar desek daha doğru olur. 🙂

Bu kadar teorik bilgiden sonra şimdi biraz yapısına göz atalım:

c# singly linked listYukarıda 5 elemanlı bir LinkedList görmekteyiz. Teorik bilgiden bahsederken bir başlangıcı ve sonu vardır demiştik. 1. eleman (node) burada bize başlangıcı verirken 5. eleman ise sonu vermektedir ve son elemanın NextNode’un null olduğu unutulmamalıdır.

Tren vagonları gibi birbirlerine bağlı olarak giden bu listenin elemanları arasında gezmekte mümkündür. Her eleman kendinden bir önceki elemanı (PrevNode) (Doubly Linked List için geçerlidir bu yapı) ve kendinden bir sonraki elemanı (NextNode) (Doubly ve Singly içinde geçerlidir) tutmaktadır.

İncelemiş olduğumuz yapısından sonra Linked List’ler hakkında:

  • Yeni bir eleman için hafızada yer ayrılır
  • Her eleman kendinden bir önceki ve kendinden bir sonraki eleman bilgisini tutar
  • Dizlerde olduğu gibi bir boyut belirtmemize gerek yoktur

diyebiliriz.

Şimdi bir örnek pekiştirelim:

Örneğimizde telefon rehberi için olan Person sınıfında kişi bilgileri tutulurken LinkedList sınıfında ise bağlı listemiz bulunacaktır ve örneğimiz custom bir Linked List yapısını incelemektir.  Singly Linked List’ten biraz farklı olarak elemanlar arası iterasyon yapabilmek için PrevNode özelliğinde ekleyerek böylece Doubly Linked List mantığınada bakmış olacağız çift taraflı.

Bu örneğimizde en basit anlamıyla custom Singly Linked List nasıl oluşturulur ve Doubly Linked List mantığı nedir, elemanları arasında nasıl dönülüp araya eleman eklenir görmüş olduk.

İleriki makalelerde görüşmek dileğiyle.

 

Bu makale toplam (4922) kez okunmuştur.

15
2



Kategori: .NET

4 Yorum

  1. Akçay Akçay

    Dostum eline sağlık ama bir sorum olacak boyutunu belirlemiyoruz güzel de her eleman kendinden önceki ve sonraki elemanı tutuyorsa belleği sömürmez mi normalde kullanması gereken alanın n veri için 3n-2 kadar veri tutması gerekir bu da istenmeyen birşey değil mi?

    • Buradaki “bellek sömürmeyi” kendinden sonraki elemanı tutma şeklinde gibi kıyaslamamak gerek performans ölçütü olarak. Çünkü normal bir dizide default olarak atıyorum 1000 length belirtip belleği allocate ediyorsun. Hele ki 1000 length gereksiz ise o veri için. Oysa ki buradaki sormuş olduğun durum dikkat edersen LinkedList yapısı gereğince burdaki Doubly Linked List oluyor kendinden önceki ve sonrakini tutma işlemi zaten var olan eklenmiş elemanın referans’ını tutmakta. Yeni bir eleman daha değil. O yüzden belleği sömürme işlemi olmaz ve dolayısıyla gereksiz length’ler ile belleği allocate etmişde olmayacaksın. Bunun en güzel örneği linkedlist kullanımı streaming işlemlerinde görebilirsin bilinmeyen buffer’ın length belirleme işlemlerinde ve tekrardan sıfırlama vs.

  2. Merhaba, Generic List kullanarak da aynı sonucu elde edemez miydik? Bu kadar zahmete gerek var mıydı? (Ya da bir noktayı kaçırmış olabilirim.)

    • Merhaba, aslında bunun cevabını yukarıdaki cevabımda da vermiştim. Evet, iş her ne ise yapılabilir Generic List aracılığı ilede. Enterprise seviye de veya gerçekten hafıza yönetiminin önemli olduğu durumlar üzerinde bir uygulama geliştirirken, her nasılsa C programlamada her değişkenin boyutları hesaplanarak kullanıldığı gibi C#’dada gelişi güzel nesneler türetmemeliyiz. Bu gibi durumlarda değişken boyutlu diziler için sabit boyutlu bir dizi oluşturarak memory’i doldurmak pek de iyi olmayacaktır. Onun için Linked List yapıları aracılığı ile değişken yapılara ayak uydurabiliriz en kaba tabiri ile. Hafızanın önemli olduğu durumları Masaüstü cihazlar için düşünmeyin, örneğin windows mobile işletim sistemi kullanan el terminalleri için düşünün 200mb ram’leri bulunan… Saygılarımla.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*