Bağlı liste, veri yapısı'dır ve elemanların doğrusal bir dizisidir. Her eleman, veri depolayan bir düğüm ve bir sonraki düğüme işaret eden bir bağlantı (veya işaretçi) içerir. Dizilerin aksine, bağlı listedeki elemanlar bellekte ardışık konumlarda saklanmak zorunda değildir. Bu, bağlı listelerin dinamik boyutlandırma ve kolay ekleme/çıkarma işlemleri gibi avantajlar sunmasını sağlar.
Düğüm (Node): Bağlı listenin temel yapı taşıdır. Genellikle iki bölümden oluşur:
NULL
veya None
olarak ayarlanır.Baş (Head): Listenin ilk düğümüne işaret eden göstericidir. Listenin tamamına erişmek için baş düğüme sahip olmak gereklidir.
Kuyruk (Tail): Listenin son düğümüdür. Kuyruk düğümünün bağlantısı genellikle NULL
veya None
olarak ayarlanır.
Bağlı listeler, bağlantı yönüne, döngüselliğine ve düğüm sayısına bağlı olarak farklı türlere ayrılır:
Tek Yönlü Bağlı Liste (Singly Linked List): Her düğüm sadece bir sonraki düğüme işaret eder. Listenin sadece bir yönde (baştan sona) geçilmesi mümkündür.
Çift Yönlü Bağlı Liste (Doubly Linked List): Her düğüm hem bir sonraki düğüme hem de bir önceki düğüme işaret eder. Bu, listenin her iki yönde de (baştan sona ve sondan başa) geçilmesini sağlar. Bu tür listeler, daha fazla bellek gerektirir ancak daha esnektir.
Dairesel Bağlı Liste (Circular Linked List): Son düğüm, baş düğüme işaret eder, böylece liste döngüsel hale gelir. Tek yönlü veya çift yönlü olabilirler.
Çoklu Bağlı Liste (Multiply Linked List): Her düğüm birden fazla bağlantıya sahip olabilir, bu da karmaşık ilişkileri temsil etmeyi mümkün kılar. Örneğin, bir ağaç yapısını temsil etmek için kullanılabilirler.
Dinamik Boyut: Bağlı listelerin boyutu, çalışma zamanında dinamik olarak artırılabilir veya azaltılabilir. Bu, önceden boyut belirtme zorunluluğunu ortadan kaldırır.
Kolay Ekleme ve Çıkarma: Yeni bir düğüm eklemek veya çıkarmak, sadece bağlantıları güncelleyerek kolayca yapılabilir. Dizilerde ise elemanların kaydırılması gerekebilir.
Bellek Kullanımı: Bağlı listeler, bellek kullanımında daha esnek olabilir. Elemanlar bellekte ardışık olmak zorunda olmadığından, bellek parçalanmasından daha az etkilenirler.
Rastgele Erişim Yok: Dizilerde olduğu gibi doğrudan bir elemana erişmek mümkün değildir. Belirli bir elemana ulaşmak için listenin başından başlayarak sırayla dolaşmak gerekir. Bu, erişim süresini artırır.
Ek Bellek Kullanımı: Her düğüm, bir sonraki düğüme işaret eden bir bağlantı (işaretçi) içerdiği için, dizilere göre daha fazla bellek kullanır. Çift yönlü bağlı listelerde bu ek bellek daha da artar.
Önbellek Performansı: Bellekte ardışık olmayan elemanlar nedeniyle, önbellek performansı dizilere göre daha düşüktür.
Ekleme (Insertion):
Çıkarma (Deletion):
Arama (Searching): Belirli bir değere sahip bir düğümü bulmak için liste boyunca arama yapılır.
Geçiş (Traversal): Listenin tüm elemanlarını sırayla ziyaret etme işlemidir.
Bağlı listeler, çeşitli uygulamalarda kullanılır:
Yığın (Stack) ve Kuyruk (Queue) Veri Yapıları: Bağlı listeler kullanılarak kolayca uygulanabilirler. Yığın veri yapısı LIFO (Last-In, First-Out) prensibine göre çalışırken, Kuyruk veri yapısı FIFO (First-In, First-Out) prensibine göre çalışır.
Sembol Tabloları: Derleyicilerde ve yorumlayıcılarda sembol tablolarını uygulamak için kullanılabilirler.
Çok Terimli Hesaplama: Matematiksel ifadeleri temsil etmek ve manipüle etmek için kullanılabilirler.
Graf Veri Yapıları: Komşu listesi (Adjacency List) kullanarak graf veri yapılarını temsil etmek için kullanılabilirler.
Bellek Yönetimi: İşletim sistemlerinde bellek yönetimi için kullanılabilirler.
Geri Al/Yinele (Undo/Redo) Fonksiyonları: Uygulamalarda kullanıcı eylemlerini izlemek ve geri almak/yinelemek için kullanılabilirler.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def append(self, data):
new_node = Node(data)
if self.head is None:
self.head = new_node
return
last_node = self.head
while last_node.next:
last_node = last_node.next
last_node.next = new_node
def print_list(self):
current_node = self.head
while current_node:
print(current_node.data)
current_node = current_node.next
# Örnek Kullanım
linked_list = LinkedList()
linked_list.append(1)
linked_list.append(2)
linked_list.append(3)
linked_list.print_list() # Output: 1 2 3
Bu örnek, temel bir tek yönlü bağlı liste uygulamasını göstermektedir. Farklı programlama dillerinde benzer şekilde uygulanabilir.
Bağlı listeler, dinamik boyutlandırma ve kolay ekleme/çıkarma gibi avantajları olan önemli bir veri yapısıdır. Ancak, rastgele erişim eksikliği ve ek bellek kullanımı gibi dezavantajları da vardır. Uygulama gereksinimlerine göre en uygun veri yapısını seçmek önemlidir. Farklı veri yapıları hakkında bilgi almak için Diğer Veri Yapıları sayfasına bakabilirsiniz.