↔️ 4.3: Doubly Linked List

Çift Yönlü Bağlı Liste - İleri ve Geri Gitme

🤔 Doubly Linked List Nedir?

Her node hem önceki (prev) hem de sonraki (next) node'a işaretçi tutar. Bu sayede listede iki yönlü hareket edebiliriz.

NULL
prev
A
next
prev
B
next
prev
C
next
NULL
◀ prev | DATA | next ▶

🎮 İnteraktif Simülasyon

📊 Singly vs Doubly Karşılaştırma

➡️ Singly Linked List

  • Sadece ileri gidebilir
  • Daha az hafıza (1 pointer)
  • Silme için önceki node lazım
  • Sondan silme O(n)

↔️ Doubly Linked List

  • İleri ve geri gidebilir
  • Daha fazla hafıza (2 pointer)
  • Silme kolaylaşır (prev var)
  • Sondan silme O(1) (tail ile)

💻 Python Implementasyonu

Python Kodu
class DoublyNode:
    """Çift yönlü bağlı liste düğümü"""
    def __init__(self, data):
        self.data = data
        self.prev = None  # Önceki node
        self.next = None  # Sonraki node

class DoublyLinkedList:
    """Çift Yönlü Bağlı Liste"""
    
    def __init__(self):
        self.head = None
        self.tail = None
        self.size = 0
    
    def append(self, data):
        """Sona ekle - O(1)"""
        new_node = DoublyNode(data)
        
        if not self.head:
            self.head = self.tail = new_node
        else:
            new_node.prev = self.tail
            self.tail.next = new_node
            self.tail = new_node
        
        self.size += 1
        print(f"✅ Sona eklendi: {data}")
    
    def prepend(self, data):
        """Başa ekle - O(1)"""
        new_node = DoublyNode(data)
        
        if not self.head:
            self.head = self.tail = new_node
        else:
            new_node.next = self.head
            self.head.prev = new_node
            self.head = new_node
        
        self.size += 1
        print(f"✅ Başa eklendi: {data}")
    
    def delete_node(self, node):
        """Belirli node'u sil - O(1)"""
        if not node:
            return
        
        # Önceki node'un next'ini güncelle
        if node.prev:
            node.prev.next = node.next
        else:
            self.head = node.next  # Silinen head ise
        
        # Sonraki node'un prev'ini güncelle
        if node.next:
            node.next.prev = node.prev
        else:
            self.tail = node.prev  # Silinen tail ise
        
        self.size -= 1
        print(f"🗑️ Silindi: {node.data}")
    
    def pop_back(self):
        """Sondan sil - O(1) 🎉"""
        if not self.tail:
            print("❌ Liste boş!")
            return None
        
        data = self.tail.data
        self.delete_node(self.tail)
        return data
    
    def pop_front(self):
        """Baştan sil - O(1)"""
        if not self.head:
            print("❌ Liste boş!")
            return None
        
        data = self.head.data
        self.delete_node(self.head)
        return data
    
    def display_forward(self):
        """İleri doğru göster"""
        if not self.head:
            print("Liste: [BOŞ]")
            return
        
        elements = []
        current = self.head
        while current:
            elements.append(str(current.data))
            current = current.next
        
        print(f"İleri  → : NULL ← {' ⟷ '.join(elements)} → NULL")
    
    def display_backward(self):
        """Geri doğru göster"""
        if not self.tail:
            print("Liste: [BOŞ]")
            return
        
        elements = []
        current = self.tail
        while current:
            elements.append(str(current.data))
            current = current.prev
        
        print(f"Geri  ← : {' ⟷ '.join(elements)}")

# Test
print("↔️ Doubly Linked List Demo\n")
dll = DoublyLinkedList()

dll.append(10)
dll.append(20)
dll.append(30)
dll.display_forward()

print()
dll.prepend(5)
dll.display_forward()
dll.display_backward()

print()
print("🎉 Sondan silme O(1):")
dll.pop_back()
dll.display_forward()

print()
print("🎉 Baştan silme O(1):")
dll.pop_front()
dll.display_forward()
Çıktı bekleniyor...

🎯 Kullanım Alanları

🌐

Tarayıcı Geçmişi

İleri/Geri butonları

🎵

Müzik Çalar

Önceki/Sonraki şarkı

📝

Metin Editörü

Undo/Redo işlemleri

🎮

LRU Cache

En az kullanılan önbellek

📊 Zaman Karmaşıklığı

Operasyon Singly Doubly
Başa Ekleme O(1) O(1)
Sona Ekleme (tail ile) O(1) O(1)
Baştan Silme O(1) O(1)
Sondan Silme O(n) 😢 O(1) 🎉
Verilen Node'u Silme O(n) O(1) 🎉
Hafıza (node başına) data + 1 pointer data + 2 pointer