Bağlı Liste İşlemleri
Bu rehberde, bağlı liste üzerindeki farklı işlemleri öğreneceksiniz. Ayrıca c# dilinde kuyruk implementasyonunu göreceksiniz.
Bağlı listeler üzerinde farklı işlemler yapmamızı sağlayan çeşitli bağlı liste işlemleri vardır.
İşte bu makalede ele alacağımız temel bağlantılı liste işlemlerinin bir listesi.
Traversal - Bağlı listedeki her elemana erişme
Ekleme - Bağlı listeye yeni bir düğüm ekleme
Silme - Bağlı listedeki bir düğümü kaldırma
Arama - Bağlı listede düğüm arama
Sıralama - Bağıl listenin düğümlerini sıralama
Yukarıdaki bağlı liste işlemlerine detaylıca girmeden önce bağıl liste hakkında bilgi sahibi olduğunuzdan emin olun.
Bağlı Liste Hakkında Hatırlanması Gerekenler
Bağlı listenin ilk düğümünü
head
olarak işaretlenir.Bağlı listenin son düğümünde
next
işaretçisinull
‘dır. Eğer sıradaki düğümünnext == null
ise bağlı listenin sonuna ulaşılır.
Tüm örneklerde, bağlı listenin aşağıdaki gibi düğüm yapısına sahip üç düğüm olduğunu varsayacağız:
1 ---> 2 ---> 3
public class Node
{
public int data;
public Node next;
}
Bağlı Listede Gezinme
Bağlı listenin içeriğini göstermek oldukça basit. Temp
işaretcisini head
‘ten başlatıp bir sonrakine taşımaya devam ediyoruz ve içeriğini gösteriyoruz.
Temp
işaretçimiz null
olduğunda bağlı listenin sonuna geldiğimizi anlıyoruz ve while döngüsünden çıkıyoruz.
Node temp = head;
Console.WriteLine('Bağlı Liste Elemanları\n')
while(temp != null) {
Console.WriteLine(temp +' --> ');
temp = temp.next;
}
Programın çıktısı aşağıdaki gibi olacaktır:
Bağlı Liste Elemanları
1 ---> 2 ---> 3 --->
Bağlı Listeye Eleman Ekleme
Bağlı listenin başına, ortasına yada sonuna eleman ekleyebilirsiniz.
Başa Ekleme
Yeni bir düğüm oluştur.
Data değişkenine istediğiniz değerini atayın.
Yeni düğümün next işaretçisini
head
‘i gösterecek şekilde güncelleyin.head
işaretçisinde oluşturduğunuz düğümü gösterin.
Node newNode = new Node { data = 5 };
newNode.next = head;
head = newNode;
Sona Ekleme
Yeni bir düğüm oluştur.
Data değişkenine istediğiniz değerini atayın.
Son düğüme kadar gidin.
Son düğümün next işaretçisini oluşturduğunuz düğümü gösterecek şekilde güncelleyin.
Node newNode = new Node { data = 5 };
newNode.next = null;
Node temp = head;
while(temp != null) {
temp = temp.next;
}
temp.next = newNode;
Ortaya Ekleme
Yeni bir düğüm oluştur.
Data değişkenine istediğiniz değerini atayın.
Istenilen indekse kadar düğümler arasında gezinin.
next
işaretçilerini yeni düğüm aralarında olacak şekilde güncelleyin.
Node newNode = new Node { data = 5 };
newNode.next = null;
Node temp = head;
for(int i=2; i < position; i++) {
if(temp.next != null) {
temp = temp.next;
}
}
newNode.next = temp.next;
temp.next = newNode;
Bağlı listeden Eleman Silme
Bağlı listenin başından, ortasından yada sonundan eleman silebilirsiniz.
Baştan Silme
Head
işaretçisini ikinci düğüm olarak güncelleyin.
head = head.next;
Soldan Silme
Sondan ikinci elemana kadar gezinin.
next
işaretçisininull
olarak belirtin.
Node temp = head;
while(temp.next.next != null){
temp = temp.next;
}
temp.next = null;
Ortadan Silme
Silinecek elemandan öncesine kadar gezinin.
Düğümü zincirden çıkarmak için
next
işaretçileri değiştirin.
for(int i=2; i< position; i++) {
if(temp.next != null) {
temp = temp.next;
}
}
temp.next = temp.next.next;
Bağlı Listede Eleman Arama
Aşağıdaki adımları kullanarak bağlı listedeki bir öğeyi bir döngü yardımıyla arayabilirsiniz.
Item
elemanını bağlı liste üzerinde arayalım.
head
işaretcisinicurrent
düğüm olarak belirtiyoruz.current
işaretcisinull
olana dek devam ediyoruz çünkü bağlı listedeki son elemanın işaretcisinull
‘dır.Her bir adımda, düğümün verisinin
item
ile eşleşip eşleşmediğini kontrol ediyoruz. Eğer eşleşirsetrue
, eşleşmezsefalse
döndürüyoruz.
bool searchNode(Node head_ref, int key) {
Node current = head_ref;
while (current != null) {
if (current.data == key)
return true;
current = current.next;
}
return false;
}
Bağlı Listede Eleman Sıralama
Aşağıda, bağlı bir listenin öğelerini küçükten büyüğe doğru sıralamak için basit bir sıralama algoritması olan balon sıralaması kullanacağız. Sırasıyla:
head
işaretcisinicurrent
düğüm olarak belirtin veìndex
adında başka bir düğümü sonra kullanmak üzere oluşturun.head
eğernull
ise işlemi sonlandırılır.Yukarıdaki koşul gerçekleşmediyse son düğüme kadar döngüyü çalıştırın.
Her bir adımda 5. ve 6. adımları takip edin.
current
düğümünün sıradaki adresiniindex
e kaydedinMevcut düğüm verisinin bir sonraki düğümden daha büyük olup olmadığını kontrol edin. Eğer büyükse,
current
ileindex
yer değiştirin.
Çalışma mantığını daha iyi anlamak için balon sıralama makalesine bakın.
public void sortLinkedList(Node head_ref) {
Node current = head_ref, index = null;
int temp;
if (head_ref == null) {
return;
} else {
while (current != null) {
// index mevcut düğümün next'ini gösteriyor
index = current.next;
while (index != null) {
if (current.data > index.data) { // bubble sort
temp = current.data;
current.data = index.data;
indexdata = temp;
}
index = index.next;
}
current = current.next;
}
}
}
C# Dilinde Bağlı Liste Implementasyonu
class Program
{
static void Main(string[] args)
{
LinkedList llist = new LinkedList();
llist.insertToTail(1);
llist.insertToHead(2);
llist.insertToHead(3);
llist.insertToTail(4);
llist.insertAfter(llist.head.next, 5);
Console.WriteLine("\nEleman Silindikten sonra Liste:");
llist.removeNode(3);
llist.printList();
llist.sort(llist.head);
Console.WriteLine("\nSıralanmış Liste: ");
llist.printList();
}
}
public class LinkedList
{
public Node head;
//Başa ekleme
public void insertToHead(int new_data)
{
Node new_node = new Node(new_data);
new_node.next = head;
head = new_node;
}
//Ortaya ekleme
public void insertAfter(Node prev_node, int new_data)
{
if (prev_node != null) { // Öncesinde düğüm varsa
Node new_node = new Node(new_data);
new_node.next = prev_node.next;
prev_node.next = new_node;
}
}
//Sona Ekleme
public void insertToTail(int new_data)
{
Node new_node = new Node(new_data);
if (head == null) { //Eğer liste boş ise head olarak belirt
head = new Node(new_data);
return;
}
new_node.next = null;
Node last = head;
while (last.next != null)//Sona kadar gezinir
last = last.next;
last.next = new_node;
return;
}
// Düğüm Silme
public void removeNode(int position)
{
if (head == null)//Liste boş ise sonlandır
return;
Node temp = head;
if (position == 0){ // 0.indeks ise baştan siler
head = temp.next;
return;
}
// Silinecek düğüm aranır
for (int i = 0; temp != null && i < position - 1; i++)
temp = temp.next;
// Eğer düğüm bulunamamışsa
if (temp == null || temp.next == null)
return;
// düğümü sil
Node next = temp.next.next;
temp.next = next;
}
//Düğüm arama
public bool search(Node head, int key)
{
Node current = head;
while (current != null)//Sona kadar gider ve key degerini kontrol eder
{
if (current.data == key)
return true;
current = current.next;
}
return false;
}
//Bubble sort ile sıralama
public void sort(Node head)
{
Node current = head;
Node index = null;
int temp;
if (head == null) { //Liste boş ise sonlandır
return;
}
else {
while (current != null) {
// index mevcut düğümün sıradakini temsil eder
index = current.next;
while (index != null) {
if (current.data > index.data) {//bubble sort
temp = current.data;
current.data = index.data;
index.data = temp;
}
index = index.next;
}
current = current.next;
}
}
}
// Listeyi Yazdırma
public void printList()
{
Node tnode = head;
while (tnode != null) {
Console.WriteLine(tnode.data + " ");
tnode = tnode.next;
}
}
}
//Düğüm Sınıfı
public class Node
{
public Node(int value)
{
data = value;
next = null;
}
public int data;
public Node next;
}