Необходимо было реализовать кольцевой список. Сделал через методы расширения. Но есть один нюанс. Как реализовать возврат из метода первого значения в узле? В данном случае у меня возвращается при первом проходе всегда второе значение ("Таня"), потом после последнего узла, переход к первому значению.
class Program
{
static void Main(string[] args)
{
// Создадим связный список
LinkedList<string> linkedList = new LinkedList<string>();
// Добавим несколько элементов
linkedList.AddFirst("Вася");
linkedList.AddFirst("Петя");
linkedList.AddFirst("Таня");
linkedList.AddFirst("Коля");
// Отобразим элементы в прямом направлении
LinkedListNode<string> node;
Console.WriteLine("Элементы коллекции в прямом направлении: ");
for (node = linkedList.First; node != null; node = node.Next)
Console.Write(node.Value + "\t");
Console.WriteLine();
var result = GetValue(linkedList.First);
Console.WriteLine($"+++++++ {result} ++++++++");
Console.ReadKey();
}
private static string GetValue(LinkedListNode<string> node)
{
node = CircularLinkedList.NextOrFirst(node);
return node.Value;
}
}
Extension метод для односвязного списка:
public static class CircularLinkedList
{
public static LinkedListNode<T> NextOrFirst<T>(this LinkedListNode<T> current)
{
return current.Next ?? current.List.First;
}
public static LinkedListNode<T> PreviousOrLast<T>(this LinkedListNode<T> current)
{
return current.Previous ?? current.List.Last;
}
}
У метода GetValue неправильное название:
private static string GetNextCircularValue(LinkedListNode<string> node)
{
node = CircularLinkedList.NextOrFirst(node);
return node.Value;
}
Возможно, Вы хотели сделать следующее:
private static string GetValueAndAdvance(ref LinkedListNode<string> node)
{
string result = node.Value;
node = CircularLinkedList.NextOrFirst(node);
return result;
}
node = linkedList.First;
var result = GetValueAndAdvance(ref node);
Так как в данном коде
private static string GetValue(LinkedListNode<string> node)
{
node = CircularLinkedList.NextOrFirst(node);
return node.Value;
}
сначала получается следующий элемент, а только потом берется значение, при передаче первого элемента значение будет получено у следующего.
Для решения, достаточно передавать не первый элемент, а последний:
var result = GetValue(linkedList.Last);
Сборка персонального компьютера от Artline: умный выбор для современных пользователей