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 (x24x+7x^2 - 4x + 7 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