Является ли LinkedList в .NET круговым связанным списком? - PullRequest
17 голосов
/ 22 июня 2009

Мне нужен круговой связанный список, поэтому мне интересно, если LinkedList является круговым связанным списком?

Ответы [ 5 ]

57 голосов
/ 07 сентября 2011

Быстрое решение для использования его по кругу, когда вы хотите переместить «следующий» кусок в списке:

current = current.Next ?? current.List.First;

Где ток LinkedListNode<T>.

16 голосов
/ 22 июня 2009

Нет. Это дважды связанный список, но не круговой связанный список. Подробнее см. MSDN .

.

LinkedList является хорошей основой для вашего собственного кругового связанного списка. Но у него есть определенное свойство First и Last, и они не будут перечисляться вокруг него, как будет у правильного кругового связного списка.

6 голосов
/ 22 июня 2009

Если вам нужна циклическая структура данных, взгляните на C5 универсальную библиотеку коллекций . У них есть любая коллекция, которая может быть полезна, включая круговую очередь (которая может вам помочь).

4 голосов
/ 23 октября 2015

Хотя общедоступный API-интерфейс LinkedList не является циклическим, внутренне он фактически является. Обращаясь к справочному источнику , вы можете увидеть, как он реализован:

// This LinkedList is a doubly-Linked circular list.
internal LinkedListNode<T> head;

Конечно, чтобы скрыть тот факт, что он циклический, свойства и методы, которые пересекают список, делают проверки, чтобы предотвратить перенос обратно на голову.

LinkedListNode:

public LinkedListNode<T> Next {
    get { return next == null || next == list.head? null: next;}
}

public LinkedListNode<T> Previous {
    get { return prev == null || this == list.head? null: prev;}
}

LinkedList.Enumerator:

public bool MoveNext() {
    if (version != list.version) {
        throw new InvalidOperationException(SR.GetString(SR.InvalidOperation_EnumFailedVersion));
    }

    if (node == null) {
        index = list.Count + 1;
        return false;
    }

    ++index;
    current = node.item;   
    node = node.next;  
    if (node == list.head) {
        node = null;
    }
    return true;
}
4 голосов
/ 22 июня 2009

Нет, это не так. См. MSDN

...