Создание очень простого однократного кругового списка C # - PullRequest
2 голосов
/ 02 апреля 2011

У кого-нибудь есть пример очень простой реализации кругового связного списка с использованием C #?

У меня есть этот связанный список, но я не знаю, как это сделать:

    public class LinkedList
    {
        public class Node
        {
            public Node next;
            public Object data;
        }

        private Node head;

        public void Add(Object data)
        {
            Node toAdd = new Node();
            toAdd.data = data;
            Node current = head;                
            current.next = toAdd;
        }

    }

Спасибо.

1 Ответ

6 голосов
/ 02 апреля 2011

Чтобы ваш связанный список был круглым, ваш хвостовой узел должен ссылаться на головной узел.Так что это просто вопрос выполнения этого в конце вашего Add() метода:

toAdd.next = head;

Обратите внимание, что ваш Add() метод не выполняет итерацию по всем узлам в вашем связанном списке, он просто делает

Node current = head;

Так что, если вы попытаетесь добавить несколько узлов, будет обновлен только головной узел, чтобы он указывал на каждый новый, заменяя любую ссылку, которую он имел в каждом вызове Add(), и вашсвязанный список всегда будет содержать не более 2 узлов.

Вы можете перебирать каждый узел следующим образом (это заменяет строку, о которой я упоминал выше):

Node current = head;

while (current.next != head)
{
    current = current.next;
}

Теперь current будет представлятьваш хвостовой узел, независимо от того, сколько узлов вы добавляете в свой связанный список.Затем вы можете добавить новый хвостовой узел, сделать старый один указателем на новый, а новый - на ваш головной узел.

Другое дело: ваша текущая реализация Add() требует инициализацииВаш связанный список с головным узлом, в противном случае NullReferenceException будет поднят, если вы попытаетесь что-либо добавить.Вы можете написать конструктор для решения этой проблемы легко.

...