Linked List Veri Yapısı
Bağlı listeler (linked list), bilgisayar bilimlerinde temel bir veri yapısı olmakla birlikte,
farkında olmadan pek çok uygulamada karşımıza çıkar. Temel olarak verinin saklandığı bir konteynır olan düğümden (node) oluşur. Düğümün içinde veri (data) ve bir sonraki düğümün adresini tutan işaretçiden vardır. Son düğümde, sonraki düğümün adresi NULL
olarak görünür.
Bağlı listelerin bazı uygulama alanları:
- Resim görüntüleyici: Önceki ve sonraki resimler birbirine bağlıdır ve birbirlerine kendileri üzerinden erişilebilir.
- Robotik: Bağlı listeler, robotların çevreleriyle etkileşim kurmalarına ve gezinmelerine olanak tanıyan kontrol sistemlerini uygulamak için kullanılabilir.
- Görev zamanlaması: İşletim sistemleri, yürütülmeyi bekleyen her bir işlemin (process) listede bir düğüm (node) olarak temsil edildiği görev zamanlasını yönetmek için bağlı listeler kullanır.
- Polinom gösterimi: Polinomlar ( gibi cebirsel ifadeler), her bir düğüm bir katsayıyı gösterecek şekilde bağlı listeler ile temsil edilebilir.
Python’da bir bağlı liste implementation’u:
class Node:
def __init__(self, value, next_node=None):
self._value = value
self._next_node = next_node
@property
def value(self):
return self._value
@property
def next_node(self):
return self._next_node
@next_node.setter
def next_node(self, node):
self._next_node = node
class LinkedList:
def __init__(self, value=None, node=Node):
self._Node = node
if value is not None:
self.head_node = self._Node(value)
self.tail_node = self.head_node
self._size = 1
else:
self.head_node = None
self.tail_node = None
self._size = 0
def insert_head(self, value):
new_node = self._Node(value)
new_node.next_node = self.head_node
self._size += 1
self.head_node = new_node
if self._size == 1:
self.tail_node = new_node
def insert_tail(self, value):
new_node = self._Node(value)
if self._size == 0:
self.head_node = new_node
self.tail_node = self.head_node
else:
self.tail_node.next_node = new_node
self.tail_node = new_node
self._size += 1
def delete_head(self):
if self.head_node is None:
raise Exception("Cannot delete from an empty list")
second_node = self.head_node.next_node
self._size -= 1
self.head_node = second_node
def delete_tail(self):
if self.head_node is None:
raise Exception("Cannot delete from an empty list")
elif self._size == 1:
self.head_node = None
self.tail_node = None
else:
current_node = self.head_node
while current_node.next_node.next_node is not None:
current_node = current_node.next_node
self.tail_node = current_node
current_node.next_node = None
self._size -= 1