KÜRE LogoKÜRE Logo

Bağlı Liste Veri Yapısı

Bilişim Ve İletişim Teknolojileri+2 Daha
fav gif
Kaydet
kure star outline

Bağlı liste, bilgisayar bilimlerinde temel bir veri yapısıdır. Esas olarak dizilere kıyasla verimli ekleme ve silme işlemlerine izin verir. Diziler gibi, stack, queue ve deque gibi diğer veri yapılarını uygulamak için de kullanılır.


Veri Yapısı: Bitişik Olmayan

Bellek Tahsisi: Tipik olarak tek tek elemanlara tek tek tahsis edilir

Ekleme/Silme: Verimli

Erişim: Sıralı


Tek Bağlantılı Liste

Tekli bağlı liste temel bir veri yapısıdır, her düğümün bir veri alanı ve bağlı listedeki bir sonraki düğüme bir referans içerdiği düğümlerden oluşur. Son düğümün bir sonraki düğümü null'dur ve listenin sonunu gösterir. Bağlı Listeler etkin ekleme ve silme işlemlerini destekler.


Düğüm (Node) Yapısı

Tekli bağlı listede her düğüm iki parçadan oluşur: veri ve bir sonraki düğüme bir işaretçi. Bu yapı, düğümlerin dinamik olarak birbirine bağlanmasına ve zincir benzeri bir dizi oluşturmasına olanak tanır.

Tekli Bağlı Liste Yapısı (Kaynak: geeksforgeeks.com)


Tek Bağlantılı Liste İşlemleri

  • Dolaşma - Listeleme
  • Arama
  • Uzunluk Hesaplama
  • Ekleme
  • Başa ekleme
  • Sona ekleme
  • Belirli bir konuma ekleme
  • Silme
  • Baştan silme
  • Sondan silme
  • Belirli bir düğümü silme


Java ile Listeleme İşlemi:

public static void traverseLinkedList(Node head)
{
    // bağlı listenin başı (düğüm - node) belirtilir
    Node current = head;

    // listenin sonuna ulaşana kadar dolaşılır
    while (current != null) {

        // mevcut düğüm yazdırılır
        System.out.print(current.data + " ");

        // bir sonraki düğüme geçilir
        current = current.next;
    }

    System.out.println();
}


Java ile Arama İşlemi:

public boolean searchLinkedList(Node head, int target)
{
    // liste dolaşılır
    while (head != null) {
        // hedef ile mevcut düğüm karşılaştırılır
        if (head.data == target) {
            // bulunduysan true döndürülür
            return true;
        }
        // bulunmadıysa bir sonraki düğüme geçilir
        head = head.next;
    }
    // bulunmadıysa false döndürülür
    return false;
}


Java ile Uzunluk Bulma İşlemi:

public int findLength(Node head) {
  
    // başlangıç için bir değer verilir
    int length = 0;

    // baş düğümden başlanır
    Node current = head;

    // her düğümden sonra uzunluk (length) değeri 1 arttırılır.
    while (current != null) {
        length++;
        current = current.next;
    }
    // bulunan değer döndürülür
    return length;
}


Java ile Ekleme İşlemi:

// Başa Eleman Ekleme
public Node insertAtBeginning(Node head, int value) {
    // yeni bir düğüm eklenir
    Node newNode = new Node(value);

    // sonraki düğüm baş düğüm olarak işaretlenir
    newNode.next = head;

    // baş düğüm, yeni eklenen düğüm olacak şekilde güncellenir.
    head = newNode;

    // baş düğüm güncellenir.
    return head;
}

// Sona Eleman Ekleme
public static Node insertAtEnd(Node head, int value)
{
    // yeni düğüm oluşturulur
    Node newNode = new Node(value);

    // eğer liste boşsa, yeni eklenen düğüm baş düğüm olur
    if (head == null)
        return newNode;

    // son düğüme kadar liste dolaşılır
    Node curr = head;
    while (curr.next != null) {
        curr = curr.next;
    }

    // sondan bir sonraki yeni son düğüm olur
    curr.next = newNode;

    return head;
}

// Belirli Bir Konuma Eleman Ekleme
public static Node insertPos(Node head, int pos, int data)
{
    if (pos < 1) {
        System.out.println("Invalid position!");
        return head;
    }

    // Başa yerleştirmek için özel durum koşulu
    if (pos == 1) {
        Node temp = new Node(data);
        temp.next = head;
        return temp;
    }

    // Eklenecek yerden bir önceki düğümün yeri bulunur
    Node prev = head;
    int count = 1;
    while (count < pos - 1 && prev != null) {
        prev = prev.next;
        count++;
    }

    // eğer konum düğüm sayısından büyükse
    if (prev == null) {
        System.out.println("Invalid position!");
        return head;
    }

    // yeni düğüm belirtilen konuma eklenir
    Node temp = new Node(data);
    temp.next = prev.next;
    prev.next = temp;

    return head;
}


Java ile Silme İşlemi:

// Baştan Silme
static Node removeFirstNode(Node head)
{
    if (head == null)
        return null;

    Node temp = head;
    head = head.next;

    return head;
}

// Sondan Silme
Node removeLastNode(Node head)
{
    if (head == null)
        return null;

    if (head.next == null) {
        head = null;
        return null;
    }

    Node second_last = head;
    while (second_last.next.next != null)
        second_last = second_last.next;

    second_last.next = null;

    return head;
}

// Belirli Bir Konumdan Silme
public void deleteAtPosition(Node head, int position)
{
    if (head == null || position < 1) {
        return;
    }

    if (position == 1) {
        Node temp = head;
        head = head.next;
        temp = null;
        return;
    }

    Node current = head;
    for (int i = 1; i < position - 1 && current != null;
         i++) {
        current = current.next;
    }

    if (current == null || current.next == null) {
        return;
    }

    Node temp = current.next;

    current.next = current.next.next;

    temp = null;
}

Çift Bağlantılı Liste

Çift bağlı liste, her biri bir değer ve biri listedeki bir önceki düğüme, diğeri de listedeki bir sonraki düğüme işaret eden iki işaretçi içeren bir dizi düğümden oluşan bir veri yapısıdır. Bu, listenin her iki yönde de verimli bir şekilde geçilmesine olanak tanıyarak, sık ekleme ve silme işlemlerinin gerekli olduğu uygulamalar için uygun hale getirir.

Çift Bağlantılı Liste Yapısı (Kredi: geeksforgeeks.com)


Bir veri yapısında, çift bağlantılı bir liste üç alana sahip düğümler kullanılarak temsil edilir:

  • Veri
  • Bir sonraki düğümü işaretleyen işaretçi (next)
  • Bir önceki düğümü işaretleyen işaretçi (prev)
// Düğüm (Node) Tanımlama
class Node {
    int data;

    Node prev;
  
    Node next;
  
    Node(int d) {
       data = d;
       prev = next = null;      
    }
};

// Liste Sıralama ve Dolaşma
class GfG {
    static void forwardTraversal(Node head) {    
        Node curr = head;

        while (curr != null) {       
            System.out.print(curr.data + " ");

            curr = curr.next;
        }

        System.out.println();
    }

    static void backwardTraversal(Node tail) {

        Node curr = tail;
        while (curr != null) {
            System.out.print(curr.data + " ");
            curr = curr.prev;
        }

        System.out.println();
    }

    public static void main(String[] args) {

        Node head = new Node(1);
        Node second = new Node(2);
        Node third = new Node(3);

        head.next = second;
        second.prev = head;
        second.next = third;
        third.prev = second;

        System.out.println("Baştan Dolaşma:");
        forwardTraversal(head);

        System.out.println("Sondan Dolaşma:");
        backwardTraversal(third);
    }
}

// Baştan Dolaşma: 1 2 3
// Sondan Dolaşma: 3 2 1


Java ile Listenin Uzunluğunu Bulma:

//Listenin Uzunluğunu Bulma
class Node {
    int data; 
    Node prev; 
    Node next;

    public Node(int val) { 
        data = val; 
        prev = null; 
        next = null; 
    }
}


class GfG {
    static int FindLength(Node head) {
        int count = 0;
        for (Node cur = head; cur != null; cur = cur.next)
            count++;
        return count;
    }
    public static void main(String[] args) {

        Node head = new Node(1);
        Node second = new Node(2);
        Node third = new Node(3);
        
        head.next = second; 
        second.prev = head;
        second.next = third; 
        third.prev = second;

        System.out.println("Listenin uzunluğu: " + FindLength(head));
    }
}

// Listenin uzunluğu: 3 


Java ile Eleman Ekleme İşlemi:

//Listenin Başına Eleman Ekleme
class Node {
    int data;
    Node prev, next;

    Node(int d) {
        data = d;
        prev = null;
        next = null;
    }
}

class GfG {
    static Node insertBegin(Node head, int data) {

        Node new_node = new Node(data);      
        new_node.next = head;

        if (head != null) {
            head.prev = new_node;
        }

        return new_node;
    }

    static void printList(Node head) {
        Node curr = head;
        while (curr != null) {
            System.out.print(curr.data + " ");
            curr = curr.next;
        }
      	System.out.println();
    }

    public static void main(String[] args) {

        Node head = new Node(2);
        head.next = new Node(3);
        head.next.prev = head;
        head.next.next = new Node(4);
        head.next.next.prev = head.next;

        System.out.print("Orijinal Liste: ");
        printList(head);

        head = insertBegin(head, 1);

      	System.out.print("Eklendikten sonra: ");
        printList(head);
    }
}

// Listenin Sonuna Eleman Ekleme
class Node {
    int data;
    Node next, prev;

    Node(int newData) {
        data = newData;
        next = prev = null;
    }
}

class GFG {
    public static Node insertEnd(Node head, int newData) {

        Node newNode = new Node(newData);

        if (head == null) {
            head = newNode;
        }
        else {
            Node curr = head;
            while (curr.next != null) {
                curr = curr.next;
            }
            curr.next = newNode;
            newNode.prev = curr;
        }
        return head;
    }
    public static void printList(Node head) {
        Node curr = head;
        while (curr != null) {
            System.out.print(curr.data + " ");
            curr = curr.next;
        }
        System.out.println();
    }

    public static void main(String[] args) {
        Node head = new Node(1);
        head.next = new Node(2);
        head.next.prev = head;
        head.next.next = new Node(3);
        head.next.next.prev = head.next;

        System.out.println("Orijinal Bağlı Liste: ");
        printList(head);

        System.out.println("Ekledikten sonra: ");
        int data = 4;
        head = insertEnd(head, data);

        printList(head);
    }
}

// Belirli Bir Konuma Eleman Ekleme
class Node {
    int data;
    Node next;
    Node prev;

    Node(int new_data) {
        data = new_data;
        next = prev = null;
    }
}

class GFG {
    public static Node insertAtPosition(Node head, int pos, int new_data) {
        Node new_node = new Node(new_data);
        if (pos == 1) {
            new_node.next = head;
            if (head != null) {
                head.prev = new_node;
            }
            head = new_node;
            return head;
        }

        Node curr = head;
        for (int i = 1; i < pos - 1 && curr != null; ++i) {
            curr = curr.next;
        }

        if (curr == null) {
            System.out.println("Pozisyon sınırların dışında.");
            return head;
        }

        new_node.prev = curr;
        new_node.next = curr.next;
        curr.next = new_node;

        if (new_node.next != null) {
            new_node.next.prev = new_node;
        }
        return head;
    }

    public static void printList(Node head) {
        Node curr = head;
        while (curr != null) {
            System.out.print(curr.data + " ");
            curr = curr.next;
        }
        System.out.println();
    }

    public static void main(String[] args) {
        Node head = new Node(1);
        head.next = new Node(2);
        head.next.prev = head;
        head.next.next = new Node(4);
        head.next.next.prev = head.next;

        System.out.print("Orijinal Bağlı Liste: ");
        printList(head);

        System.out.print("Belirli konuma düğüm ekle: ");
        int data = 3;
        int pos = 3;
        head = insertAtPosition(head, pos, data);
        printList(head);
    }
}


Java ile Eleman Silme İşlemi:

// Baştan Eleman Silme
class Node {
    int data;
    Node prev;
    Node next;

    Node(int data) {
        this.data = data;
        this.prev = null;
        this.next = null;
    }
}

class GFG {
    public static Node delHead(Node head) {
        if (head == null) {
            return null;
        }

        Node temp = head;
        head = head.next;

        if (head != null) {
            head.prev = null;
        }

        return head;
    }

    public static void printList(Node head) {
        Node curr = head;
        while (curr != null) {
            System.out.print(curr.data + " ");
            curr = curr.next;
        }
        System.out.println();
    }

    public static void main(String[] args) {   
        Node head = new Node(1);
        head.next = new Node(2);
        head.next.prev = head;
        head.next.next = new Node(3);
        head.next.next.prev = head.next;

        System.out.print("Orijinal Bağlı Liste: ");
        printList(head);

        System.out.print("Silindikten sonra: ");
        head = delHead(head);

        printList(head);
    }
}

// Sondan Eleman Silme
class Node {
    int data;
    Node prev;
    Node next;

    Node(int data) {
        this.data = data;
        this.prev = null;
        this.next = null;
    }
}

class GFG {
    public static Node delLast(Node head) {
         if (head == null) {
            return null;
        }
        if (head.next == null) {
            return null;
        }

        Node curr = head;
        while (curr.next != null) {
            curr = curr.next;
        }

        if (curr.prev != null) {
            curr.prev.next = null;
        }

        return head;
    }

    public static void printList(Node head) {
        Node curr = head;
        while (curr != null) {
            System.out.print(curr.data + " ");
            curr = curr.next;
        }
        System.out.println();
    }

    public static void main(String[] args) {
        Node head = new Node(1);
        head.next = new Node(2);
        head.next.prev = head;
        head.next.next = new Node(3);
        head.next.next.prev = head.next;

        System.out.print("Orijinal Bağlı Liste: ");
        printList(head);

        System.out.print("Silindikten sonra: ");
        head = delLast(head);

        printList(head);
    }
}

// Belirli Bir Konumu Silme İşlemi
class Node {
    int data;
    Node prev;
    Node next;

    Node(int d) {
        data = d;
        prev = null;
        next = null;
    }
}

class GFG {
    public static Node delPos(Node head, int pos) {
        if (head == null) {
            return head;
        }

        Node curr = head;

        for (int i = 1; curr != null && i < pos; ++i) {
            curr = curr.next;
        }

        if (curr == null) {
            return head;
        }

        if (curr.prev != null) {
            curr.prev.next = curr.next;
        }

        if (curr.next != null) {
            curr.next.prev = curr.prev;
        }

        if (head == curr) {
            head = curr.next;
        }

        return head;
    }

    public static void printList(Node head) {
        Node curr = head;
        while (curr != null) {
            System.out.print(curr.data + " ");
            curr = curr.next;
        }
        System.out.println();
    }

    public static void main(String[] args) {
        Node head = new Node(1);
        head.next = new Node(2);
        head.next.prev = head;
        head.next.next = new Node(3);
        head.next.next.prev = head.next;

        System.out.print("Orijinal Bağlı Liste: ");
        printList(head);

        System.out.print("Silindikten Sonra: ");
        head = delPos(head, 2);

        printList(head);
    }
}

Kaynakça

Geeksforgeeks. "Doubly Linked List Tutorial." (2024). Erişim Adresi.


Geeksforgeeks."Linked List Data Structure." (2024). Erişim Adresi.


Geeksforgeeks. "Singly Linked List Tutorial." (2024). Erişim Adresi.


Kızıltan, Mustafa. "Linked List (Bağlı Listeler)" Erişim Adresi.


Programiz. "Linked List Data Structure." Erişim Adresi.


Ravikiran, A. S. "Types of Linked List in Data Sturctures."  (2025). Erişim Adresi.

Sen de Değerlendir!

0 Değerlendirme

Yazar Bilgileri

Avatar
Ana YazarBeyza Nur Türkü12 Şubat 2025 12:12
KÜRE'ye Sor