Menu
Coddy logo textTech

Bağlı Liste

Son güncelleme

Bir bağlı liste, bir diziyi düğümler zinciri olarak saklar; her düğüm bir değer ve bir sonraki düğüme bir işaretçi tutar. Bir diziden farklı olarak düğümler bellekte bitişik değildir; listeyi dolaşmak için next işaretçilerini takip edersiniz. Düğümlerin başa ve sona bağlanmasını, zinciri dolaşarak bir değerin aranmasını ve bir işaretçinin yeniden bağlanmasıyla bir düğümün kaldırılmasını izlemek için yukarıdan oynat'a basın.

Başa ekleme veya silme O(1)'dir çünkü sadece başı yeniden işaret edersiniz. Ortadaki bir konuma veya sona ulaşmak O(n)'dir çünkü önce oraya kadar yürümeniz gerekir. Bu ödünleşim -ucuz uçlar, rastgele erişim yok- bir bağlı listeyi bir diziden ayıran şeydir.

Zaman karmaşıklığı

İşlemKarmaşıklıkNotlar
Başa eklemeO(1)Başı yeniden işaret et
Sona eklemeO(n)Önce sona kadar yürü (kuyruk işaretçisiyle O(1))
AramaO(n)next işaretçilerini takip et
Başı silmeO(1)Başı onun ötesine yeniden işaret et
İndeksle erişimO(n)Rastgele erişim yok

Bağlı liste vs dizi

BoyutBağlı listeDizi
BellekDağınık düğümler + işaretçilerBitişik blok
Rastgele erişimO(n)O(1)
Önden ekleme/silmeO(1)O(n) (kaydırma)
Önbellek dostluğuKötüİyi

Çözümlü örnek

[10, 20] listesini oluşturma, başına 5 ekleme, ardından 20'yi silme:

AdımYapıEylem
Başlangıçhead -> nullBoş liste
Başa 10 eklehead -> 10 -> nullBaşı, next'i eski baş (null) olan yeni bir düğüme yeniden işaret et
Sona 20 eklehead -> 10 -> 20 -> null10 düğümüne yürü, next'ini yeni bir 20 düğümüne ayarla
Başa 5 eklehead -> 5 -> 10 -> 20 -> nullYeni düğüm 5 eski baş 10'a işaret eder; baş artık 5'e işaret eder
20'yi silhead -> 5 -> 10 -> null10'a yürü, next'ini 20'den null'a ayarla; 20 düğümünün bağı kesilir

Bağlı liste ne zaman kullanılır

Şu durumda kullanŞu durumda kaçın
Uçlarda (veya elinizde tuttuğunuz bir düğümde) indekslemekten çok daha fazla ekleme veya silme yaparsanızKonuma göre hızlı rastgele erişime ihtiyacınız varsa (O(1) indeksleme)
Boyut çok değişir ve yeniden boyutlandırma/kopyalama maliyeti istemezsenizÖnbellek yerelliğinin performansa hakim olduğu sıkı döngülerde gezinirseniz
Bir kuyruk, yığın veya komşuluk listesi oluşturuyorsanızBellek kısıtlıysa: her düğüm eleman başına ekstra bir işaretçi öder
Başka yerlerdeki eklemelerden sağ çıkan düğümlere kararlı referanslara ihtiyacınız varsaÇoğunlukla okur ve nadiren değiştirirseniz, bu durumda bir dizi daha basit ve hızlıdır

Linked List kodu

Python, JavaScript, Java, C++, C dillerinde temiz ve çalıştırılabilir bir Linked List uygulaması. Bir dil seçin, kodu kopyalayın veya Coddy Playground'da hazır yüklenmiş olarak açın.

Python ile Linked List kodu

Python
1class Node:2    def __init__(self, value):3        self.value = value4        self.next = None5
6
7class LinkedList:8    def __init__(self):9        self.head = None10
11    def append(self, value):12        node = Node(value)13        if self.head is None:14            self.head = node15            return16        current = self.head17        while current.next:18            current = current.next19        current.next = node20
21    def find(self, value):22        current = self.head23        while current:24            if current.value == value:25                return True26            current = current.next27        return False28
29    def delete(self, value):30        # Re-link the previous node around the match31        current, prev = self.head, None32        while current:33            if current.value == value:34                if prev is None:35                    self.head = current.next36                else:37                    prev.next = current.next38                return True39            prev, current = current, current.next40        return False41
42    def __str__(self):43        values, current = [], self.head44        while current:45            values.append(str(current.value))46            current = current.next47        return " -> ".join(values) + " -> None"48
49
50lst = LinkedList()51for value in [3, 7, 1, 9]:52    lst.append(value)53
54print("List:    ", lst)55print("find(7): ", lst.find(7))56lst.delete(1)57print("After delete(1):", lst)
Bu kodu Python Playground'da çalıştır

Bağlı Liste SSS

Bağlı liste ile dizi arasındaki fark nedir?
Bir dizi elemanları tek bir bitişik blokta saklar, bu da O(1) rastgele erişim ama elemanları kaydıran O(n) ekleme/silme sağlar. Bir bağlı liste, düğümleri bellekte herhangi bir yerde işaretçilerle bağlı olarak saklar, bu da bilinen bir konumda O(1) ekleme/silme ama zinciri dolaşmanız gerektiği için O(n) erişim sağlar.
Bağlı listeyi ne zaman kullanmalıyım?
Bağlı listeler, uçlarda (veya zaten bir referansını tuttuğunuz bir düğümde) sık sık ekleme veya çıkarma yaptığınızda ve nadiren rastgele erişime ihtiyaç duyduğunuzda parlar; örneğin kuyruklar, yığınlar, komşuluk listeleri ve LRU önbellekleri. Hızlı indeksli erişime ihtiyacınız varsa, bir dizi veya dinamik dizi genellikle daha iyidir.
Bir bağlı listenin zaman karmaşıklığı nedir?
Başa ekleme veya silme O(1)'dir. Arama veya kuyruk işaretçisi olmadan sona ulaşma O(n)'dir çünkü next işaretçilerini teker teker takip edersiniz. O(1) rastgele erişim yoktur: bir bağlı listeye indeksle erişmek O(n)'dir.
Tek yönlü ve çift yönlü bağlı liste arasındaki fark nedir?
Tek yönlü bağlı liste düğüm başına yalnızca bir next işaretçisi saklar, bu yüzden tek yönde dolaşabilirsiniz ve bir düğümü silmek öncülüne bir referans gerektirir. Çift yönlü bağlı liste bir prev işaretçisi ekler ve geriye doğru dolaşmayı ve elinizdeki bir düğümün O(1) silinmesini sağlar; bunun bedeli düğüm başına ekstra bir işaretçi ve her ekleme ve silmede daha fazla defter tutmadır.
Başa ekleme O(1) ise neden sona ekleme O(n)?
Başa ekleme yalnızca head işaretçisini yeniden bağlar, bu da sabit iştir. Sona ulaşmak, baştan sona kadar next işaretçilerini takip etmek anlamına gelir, bu da O(n)'dir. Ayrı bir tail işaretçisi tutmak sona eklemeyi de O(1) yapar, bu yüzden gerçek dünyadaki listeler genellikle her iki ucu da izler.
Bağlı listelerde her yerde O(1) ekleme var mı?
Hayır, bu yaygın bir yanılgıdır. Eklemenin kendisi yalnızca sonrasına eklediğiniz düğüme zaten bir işaretçi tuttuğunuzda O(1)'dir. O konumu değere veya indekse göre bulmak yine de O(n) maliyetindedir çünkü oraya ulaşmak için zinciri dolaşmanız gerekir.
Coddy programming languages illustration

Coddy ile algoritmalarda ustalaş

BAŞLA