Linked List Node Silme

Bir linked list’te bulunan herhangi bir node’u silmek isteyebiliriz. Bu silme işlemini; ilk node, son node n. node, belli bir data değeri olan node veya farklı bir varyasyon ile gerçekleştirebiliriz. Bu yazıda ilk node, son node ve belli bir data değerine sahip olan node’ları silme işlemini ele alacağız.

Silme işlemini yaparken her ne kadar node’u diğer node’lar ile bağlantısını keserek pratikte sağlamış olsak da o node hala bellekte yer kaplayacaktır. Bunun için her zaman silme işlemlerinde, C’de yerleşik olarak bulunan free fonksiyonunu kullanarak o node’un bellekten de silinmesini sağlamamız gerekiyor.

İlk Node’u Silme

Görseldeki gibi bir single linked list’imiz olsun. Bu linked list’in ilk node’unu, yani head node’unu silelim.

Node’u bellekten de silebilmek için temp isminde bir değişken oluşturalım ve head node’unu temp’e atayalım. head’e head’in next’ini atayalım. Böylelikle, linked list’in yeni head’i 19 oldu ve bu bir singly linked list olduğu için 78 node’una erişimi kaybettik.

struct node *temp = head;
head = head->next;

Şimdi, free fonksiyonunu kullanarak temp’e atadığımız 78 node’unu bellekten de temizleyelim.

free(temp);

Ve linked list’in ilk node’unu silme işlemini gerçekleştirdik.

Son Node’u Silme

Son node’u silme işlemini gerçekleştirmek için son node’dan bir önceki node’a erişip, o node’un next’ine son node’un next değeri olan NULL’u atamalıyız. Head aynı zamanda son eleman da olabileceğinden head’in kontrolünü ayrı olarak gerçekleştirmeliyiz.

Görseldeki linked list’in son node’unu silelim.

“temp” isminde bir değişken oluşturalım ve head node’unu temp’e atayalım. temp’in next değeri eğer NULL ise head’e NULL değerini atayalım ve “free” fonksiyonunu kullanarak temp node’unu bellekten silelim. temp’in next değeri eğer NULL değilse te temp’in next’inin next’i NULL olmadığı sürece çalışacak ve her iterasyonda temp’ temp’in next’ini atayacak bir döngü oluşturalım. Döngü tamamlandığında temp’in değeri sondan bir önceki node olacaktır. bu node’un next node’unu temp2 isminde bir değişken oluşturup, ona atayalım. Bunu yapmamızın sebebi az sonra free fonksiyonuyla bu node’u bellekten temizleyecek olmamız. Sondan bir önceki node’un yani temp node’unun next değerine NULL’u atayalım.

struct node *temp = head;
if(temp->next == NULL) {
     head = NULL;
     free(temp);
}
else {
    while(temp->next->next != NULL) {
        temp = temp->next;
    }
    struct node *temp2 = temp->next;
    temp->next = NULL;
}

Görseldeki gibi 53 node’u artık 20 node’u yerine NULL’u işaret ediyor. Son olarak free fonksiyonuyla temp2’de barınan 20 node’unu bellekten silelelim.

struct node *temp = head;
if(temp->next == NULL) {
     head = NULL;
     free(temp);
}
else {
    while(temp->next->next != NULL) {
        temp = temp->next;
    }
    struct node *temp2 = temp->next;
    temp->next = NULL;
    free(temp2);
}

Linked list’in son node’unu silme işlemini gerçekleştirdik.

Belli Bir Değere Sahip Node’u Silme

Bu varyasyonda, linked list’in son node’unu silme işlemi gibi head’in data değerini ayrı kontrol edip sonrasında diğer node’ların data değerlerini döngü ile kontrol etmeliyiz.

Görseldeki linked list’in “37” node’unu silelim.

Diğer varyasyonlarda yaptığımız gibi head’i “temp” isminde bir değişkene atayalım. temp’in data değerini kontrol edelim, eğer data değeri 37’ye eşitse head’e head’in next’ini atayalım free fonksiyonuyla tempdeki node’u bellekten temizleyelim. Değilse; temp’in next’inin data değeri, 24 olmadığı sürece çalışacak bir döngüyle silinecek olan node’dan bir önceki node’a erişim sağlayalım. temp2 isminde bir değişken oluşturup, silinecek olan temp’in next’i node’unu temp2’ye atayalım. Sonrasında, temp’in next’ine temp2’nin next değerini atayıp temp2 node’uyla linked list’in bağlantısını koparalım.

struct node *temp = head;
if(temp->data ==  37) {
     head = NULL;
     free(temp);
}
else {
    while(temp->next->data != 37)
    {
        temp = temp->next;
    }
    struct node *temp2 = temp->next;
    temp->next = temp2->next;
}

Son olarak free fonksiyonuyla 37 node’unu bellekten silelim.

struct node *temp = head;
if(temp->data ==  37) {
     head = NULL;
     free(temp);
}
else {
    while(temp->next->data != 37)
    {
        temp = temp->next;
    }
    struct node *temp2 = temp->next;
    temp->next = temp2->next;
    free(temp2);
}

Belli bir değere sahip olan node’u silme işlemini de tamamladık. Fakat bu işlem tek bir node’u siliyor. Ya o değerde birden fazla node varsa? O zaman temp=head olmak üzere, temp’in data değeri silmek istediğimiz değere eşit olduğu sürece çalışacak bir döngüyle döngü içerisinde silme işlemi yapılacak. Head’in data değerini, silmek istediğimiz değer olmadığını tayin ettiğimiz de (döngü bittiğinde) diğer node’lar için: döngü; bu sefer sondan bir önceki node’a kadar gidecek, döngü içerisinde temp’in next’inin data değerini kontrol etmemiz gerekecek. Eğer dataya silmek istediğimiz değere eşitse döngü içerisinde silme işlemi yapılacak fakat temp değeri değişmeyecek. Eşit Değilse temp’e temp’in next’ini atamamız gerekecek.

Yorum Yaz

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir