22

我需要一个循环链表,所以我想知道是否LinkedList是一个循环链表?

4

5 回答 5

73

每当您想移动列表中的“下一个”部分时,以循环方式使用它的快速解决方案:

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

电流在哪里LinkedListNode<T>

于 2011-09-07T10:07:14.187 回答
19

不,它是一个双向链表,但不是循环链表。有关这方面的详细信息,请参阅MSDN

不过,LinkedList<T> 为您自己的循环链表奠定了良好的基础。但是它确实有一个明确的 First 和 Last 属性,并且不会围绕这些进行枚举,而适当的循环链表会。

于 2009-06-22T16:49:13.897 回答
7

虽然 LinkedList 的公共 API 不是循环的,但实际上它在内部是循环的。查阅参考源码,可以看到它是如何实现的:

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

当然,为了隐藏它是循环的事实,遍历列表的属性和方法会进行检查以防止回绕到头部。

链表节点:

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.枚举器:

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;
}
于 2015-10-23T19:51:16.603 回答
6

如果您需要循环数据结构,请查看C5 通用集合库。他们有任何可以想象的有用的集合,包括一个循环队列(这可能会帮助你)。

于 2009-06-22T16:53:50.303 回答
4

不,这不对。见 MSDN

于 2009-06-22T16:46:20.900 回答