Linked List Nedir? C# - Collections

Linked List, listedeki her bir elemanın(node) birbirlerine link şeklinde bağlı olduğu generic bir veri yapısıdır. Her bir eleman, değerinin yanı sıra, referans içerir.

Veri: Node'da değerin tutulduğu yerdir.
Adres: Her bir node, bir sonraki node'a ait adresi tutar. İlk eleman head pointer'ini referans alır, son eleman ise null'ı işaret eder. Aradaki diğer node'lar da bir sonraki noda ait adresi tutar ve next pointer adı verilir.
Temel bir Linked List yapısı
                                   
Avantajları
  • Dinamiktir. Belleği dinamik olarak kullanır.
  • Dizilerde zorunlu olan boyut belirtme işlemi, linked list'ler için zorunlu değildir. Boyut arttırma işlemi otomatik olarak gerçekleşir.
  • Linked List'e eleman ekleme veya silme işlemi hızlı bir şekilde gerçekleşir. Dizilerde listeye eleman eklemek veya silmek için dizideki bütün elemanların kopyalanması gerekir. Linked List'lerde istediğimiz yere eleman ekleyebilir, istediğimiz yerden eleman silebiliriz.

Dezavantajları
  • Döngü işlemleri List yapısına göre daha yavaş gerçekleşir.
  • Linked List'te istediğimiz indexte bulunan elemana erişim için listenin başından itibaren arama yapar. Dizilerdeki gibi istediğimiz index'e erişim yoktur. 
  • Linked List'te ait bir elemana erişirken algoritma analizi sonucu ise O(n)' dir. 
Üç çeşit Linked List yapısı vardır.

Simple Linked List − Listenin elemanlarında gezerken tek yönlü bir işlem uygulanır. İleri yönlüdür. Next pointer'i ile bir sonraki değerin referansını tutar.
Singly Linked List

Doubly Linked List − Listenin elemanlarında gezerken çift yönlü bir işlem uygulanır.
İleri ve geri yönlüdür. Next pointer'i ile birlikte prev pointer'i de bulunur.Bu pointer geri yönlü hareketi sağlar.                             
Doubly Linked List

Circular Linked List − Son elemanın next pointer'i ilk elemanı işaret eder. Aynı zamanda ilk elemanın prev pointer'i ise son elemanı işaret eder. Döngü şeklinde ilerleme olduğu için circular denilmektedir. 
Circular Linked List
Linked List yapısına C# tarafından bakacak olursak System.Collections sınıfına ait generic bir yapıdır.Kullanmak istediğimizde bu sınıfı using ile eklememiz gerekmektedir. Linked List'in başına sonuna ya da istediğimiz yere ekleme yapıp, istediğimiz yerden veri silebileceğimiz özel metotları bulunmaktadır.

//Generic bir LinkedList<T> tanımlanması
LinkedList<int> linkedListNumber=new LinkedList<int>();
     
//AddFirst() - LinkedList'in başına veri ekler
linkedListNumber.AddFirst(0);
linkedListNumber.AddFirst(1);

//AddLast() - LinkedList'in sonuna veri ekler
linkedListNumber.AddLast(7);
linkedListNumber.AddLast(9);
linkedListNumber.AddLast(3);
linkedListNumber.AddLast(10);
  
//AddBefore()- LinkedList'in herhangi bir verinin öncesine veri ekler
linkedListNumber.AddBefore(linkedListNumber.Find(9), 8);

//AddAfter()- LinkedList'in herhangi bir veriden sonra veri ekler.
linkedListNumber.AddAfter(linkedListNumber.Find(9),4);

//RemoveFirst() - LinkedList'in ilk elemanını siler.
linkedListNumber.RemoveFirst();

//RemoveLast() - LinkedList'in son elemanını siler.
linkedListNumber.RemoveLast();

//Remove() - LinkedList'in herhangi bir elemanını siler.
linkedListNumber.Remove(7);

/*
Satır satır sonuçlar
0
1 0
1 0 7 
1 0 7 9
1 0 7 9 3 
1 0 7 8 9 3 10
1 0 7 8 9 4 3 10
0 7 8 9 4 3 10
0 7 8 9 4 3 
0 8 9 4 3 
*/

C#'ta LinkedList kullanırken bu yapının ilk ve son elemanına ya da bu elemanların önceki veya son elemanına ulaşıp değerlerini okuyabileceğimiz propertyler vardır.

/*
LinkedList'ten herhangi bir node'a ait veri tutan LinkedListNode türünden değişken oluşturduk.
İlk eleman için First, son eleman için Last özelliğini aldık.
*/
LinkedListNode<int> ilkEleman=linkedListNumber.First;
LinkedListNode<int> sonEleman=linkedListNumber.Last;

//İlk elemanın değeri
Console.WriteLine("İlk eleman:{0}",ilkEleman.Value);

//Son elemanın değeri
Console.WriteLine("Son eleman:{0}",sonEleman.Value);

//İlk elemanın Next değeri
Console.WriteLine("İlk elemanın Next değeri{0}:",ilkEleman.Next.Value);

//Son elemanın Previous değeri
Console.WriteLine("Son elemanın Previous değeri{0}:",sonEleman.Previous.Value);


Şimdi LinkedList'in elemanlarını yazmak için döngümüzü oluşturalım. İki döngü de aynı snucu verecektir.

while (ilkEleman!=null)
{
    Console.WriteLine(ilkEleman.Value);
    ilkEleman=ilkEleman.Next;                
}

foreach (var item in linkedListNumber)
{
     Console.WriteLine(item);
}  


Temel olarak LinkedList yapısının mantığını ve C# tarafında kullanımından bahsettim. İlerde C kodunda uygulamasını anlatan yazı hazırlamayı planlıyorum.

Keyifli okumalar...

Yorumlar