Veri Yapıları - Bağlı Liste (LinkedList)Beğen
Bağlı listeler, dizilerden farklı olarak limitsiz eleman saklamaya yarar. Bağlı listenin başlıca temel özelliklerini aşağıdaki ara yüzde olduğu gibi liste sonuna eleman eklemek, herhangi bir sıradaki elemanı silmek, herhangi bir sıradaki elemanı okuyabilmek, herhangi bir indekse eleman eklemek olarak sayabiliriz. Aşağıdaki gibi bir ara yüzle belirttim:
public interface ILinkedList<T>
{
void Add(T item);
void Remove(int index);
T Get(int index);
void Insert(int index, T item);
int GetCount();
}
Bu ara yüzü aşağıdaki gibi Node sınıfını da kullanarak gerçekleştirdim.
public class Node<T>
{
private readonly T _value;
public Node(T value)
{
_value = value;
}
private Node<T> _next;
public T Value => _value;
internal Node<T> Next { get => _next; set => _next = value; }
}
LinkedList:
public class LinkedList<T> : ILinkedList<T>
{
internal Node<T> _first;
internal Node<T> _last;
private int _count;
public LinkedList()
{
}
public void Add(T item)
{
var node = new Node<T>(item);
if (_first == null)
{
_first = node;
_last = _first;
}
else
{
_last.Next = node;
_last = node;
}
_count++;
}
public T Get(int index)
{
Node<T> node = GetNode(index);
return node.Value;
}
protected Node<T> GetNode(int index)
{
var node = _first;
for (int i = 0; i < index; i++)
{
node = node.Next;
if (node == null)
throw new System.IndexOutOfRangeException();
}
return node;
}
public void Insert(int index, T item)
{
if (index == 0) {
var temp = _first;
_first = new Node<T>(item);
_first.Next = temp;
}
else
{
var node = GetNode(index - 1);
var temp = node.Next;
node.Next = new Node<T>(item);
node.Next.Next = temp;
}
_count++;
}
public void Remove(int index)
{
if (index == 0)
{
_first = _first.Next;
}
else
{
var node = GetNode(index - 1);
node.Next = node?.Next?.Next;
}
_count--;
}
public override string ToString()
{
var str = "";
var curr = _first;
if (curr == null)
return str;
do
{
str += $"{curr.Value}, ";
curr = curr.Next;
} while (curr != null);
return str.Trim().Trim(',');
}
public int GetCount()
{
return _count;
}
}
Son olarak aşağıdaki gibi denedim.
private static void TryLinkedList(ILinkedList<short> linkedList)
{
Console.WriteLine($"Trying {linkedList.GetType().Name}");
var random = new Random();
Console.WriteLine($"Display the queue: {linkedList}\n");
for (int i = 0; i < 100; i++)
{
var randomValue = (short)random.Next(1000);
Console.WriteLine($"Trying to add {randomValue} to the list.");
linkedList.Add(randomValue);
Console.WriteLine($"{randomValue} added to the list.");
}
for (short i = 0; i < 100; i++)
{
var op = random.Next(4); //randomly enqueue or dequeue
try
{
var randomValue = (short)random.Next(1000);
int randomIndex = random.Next(100);
switch (op)
{
case 0://Add
Console.WriteLine($"Trying to add {randomValue} to the list.");
linkedList.Add(randomValue);
Console.WriteLine($"{randomValue} added to the list.");
break;
case 1://Get
Console.WriteLine($"Trying to get...");
short val = linkedList.Get(random.Next(100));
Console.WriteLine($"get item:{val}");
break;
case 2://Insert
Console.WriteLine($"Trying to insert...");
linkedList.Insert(randomIndex, randomValue);
Console.WriteLine($"{randomValue} inserted to index:{randomIndex}.");
break;
case 3://Remove
Console.WriteLine($"Trying to remove...");
linkedList.Remove(randomIndex);
Console.WriteLine($"item removed at index:{randomIndex}.");
break;
default:
break;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine($"Count: {linkedList.GetCount()}\n");
Console.WriteLine($"Display the list: {linkedList}\n");
}
}
Kaynak kodlara bu bağlantı üzerinden ulaşabilirsiniz.