C# LinkedList

Merhaba arkadaşlar,

Bu yazımda veri yapılarının önemli bir parçası olan LinkedList (Birbirine Bağlı Listeler veya Linkli Listeler) hakkında bahsedip örnek bir uygulama ile pekiştiriyor olacağız. İşin mutfağında neler olduğunu daha iyi anlamak için LinkedList veri yapısına uygun kendi veri yapımızı geliştireceğiz.

LinkedList veri yapısı, birbirine bağlı düğümlerden (node) oluşan doğrusal bir veri yapısıdır. Bu düğümler kendi içerisinde yine kendi tipinde başka düğümlere işaret eder (point). Bu düğümler (pointerlar) ile oluşan zincire verilen isimdir.

(Düğüm = Node)

Bunu bir zincir gibi düşünebilirsiniz. Zincirdeki her bir halka aslında bir düğümdür. Her bir halka (düğüm) içinde diğer halkayı temsil eden (point) başka bir halka (düğüm) ile bağlıdır. Yani Zinciri oluşturan her bir halka kendinden önceki (Doubly) ve kendinden sonraki (Doubly ve Singly) halkalara bağlanır. Zinciri ele aldığınızda halkalar arası gezine bilirsiniz, zincirin herhangi bir yerine yeni bir halka ekleyebilir veya var olan halkayı çıkarabilirsiniz.

Zincirdeki her bir halka aslında bir düğümdür (node) dedik. O zaman her Node saklanacak veri (data) ve işaret edecek adres (adress) için özellik barındırır.

  • Data özelliği istediğimiz saklamak istediğimiz verileri tutar.
  • Adress özelliği ile hangi node(lar)’a bağlanacağının işaret eder.

LinkedList veri yapısının avantajları

  • Dinamik veri yapısına sahiptir
  • Herhangi bir boyut belirtme zorunluluğu yoktur. Gerektiğinde boyutu dinamik olarak artırılır.
  • Herhangi bir eleman ekleme limiti yoktur. (Ram’in yettiği kadar eleman eklenebilir 🙂 )
  • Her Node (düğüm) kendinden bir önceki ve bir sonraki elemanın bilgisini tutar
  • Ekleme ve silme işlemin uygulamak kolaydır

LinkedList türleri

Singly LinkedList: Her düğüm (node) kendinden sonrakine bağlanır. Başlangıç ve son elemanı vardır. Son düğüm null değerini alır. (Bizim de uygulayacağımız tür olacaktır.)

Dobly LinkedList: Her düğüm (node) kendinden önceki ve kendinden sonraki düğüme bağlanır. Bu sayede çift taraflı bağlantı oluştur. (Bizim de uygulayacağımız tür olacaktır.)

Circular LinkedList: Listenin sonundaki düğüm kendinden sonraki düğüm olarak Listenin ilk düğümüne bağlanır.

Doubly Circular LinkedList: Listenin sonundaki düğüm (node) kendinden sonraki (next) düğüm olarak Listenin ilk düğümüne bağlanır. Listenin ilk düğümü kendinden önceki (prev) düğüm olarak sondaki düğüme bağlanır.

Şimdi edindiğimiz bilgileri kullanarak örnek üzerinde LinkedList veri yapısını pekiştirelim. Bu örnekte Singly ve Doubly türünü uygulamaya çalışacağız.

Singly ve Doubly türüne tekrar hatırlayacak olursak prev(Doubly), next(Doubly , Singly) gibi özelliklerle kendinden önceki ve kendinden sonraki elemanların bilgileri tutuluyor. O zaman başlayalım 🙂

Node sınıfımız: Sakyalacağımız veri (data), kendinden önceki ve kendinden sonraki bilgileri barındıran özellikler (prev, next)

LinkedList sınıfımız: Node’larımızı yöneteceğimiz sınıfımız olacak. Node’lar arası iterasyon yapabilmek için IEnumerable özelliğini uygulayacağız.

LinkedList sınıfımıza bakacak olursak; başlangıçta ilk node tutmak için bir head özelliği var. Yeni Node eklemek için 2 farklı yöntem var. AddLastNode metodu ile zincirin sonuna, AddFrontNode özelliği ile zincirin başına yeni Node ekleyebiliyoruz. IEnumerable özelliğini uyguladığımız için bizim çalışma prensibine uyacak Enumerator sınıfı uyguladık. Bu sınıf sayesinde hem foreach döngüsünde çalışacak hem de Node erişebilecek bir yapı geliştirmiş olduk.

Bu yazımda LinkedList veri yapısı hakkında edindiğim bilgileri paylaşmaya çalıştım. Umarım faydalı olmuştur.

Bir sonraki yazımda Şablon Tipli Koleksiyon Nesneler hakkında edindiğim bilgileri paylaşmaya çalışacağım. Görüşmek üzere 🙂

Kaynaklar:

Her Yönüyle C# 7.0, Sefer Algan, Pusula Yayincilik

https://www.gokhan-gokalp.com/c-linked-list-singly-linked-list-nedir/

https://www.c-sharpcorner.com/article/linked-list-implementation-in-c-sharp/

Leave a Comment