【问题标题】:Is the LinkedList in .NET a circular linked list?.NET 中的 LinkedList 是循环链表吗?
【发布时间】:2010-11-04 22:10:05
【问题描述】:

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

【问题讨论】:

  • @John,仅供参考,我阅读了文档,但如果您知道任何事情,您就会知道这是一个有效的问题,因为 LinkedList 的实现差异很大。
  • 好的,我将撤回 -1,直到您指定循环链表的含义,以及为什么 MSDN 文档没有向您说明这一点。这样,我们还可以告诉 Microsoft 如何修复文档。
  • 很公平。我想我不太相信 MS 是否正确使用了这个词。您知道有时 BCL 的声明无效。轻微但仍想确定。
  • @Dror:想到的用例是 I/O 缓冲区。

标签: c# .net linked-list


【解决方案1】:

不,不是。 See MSDN

【讨论】:

    【解决方案2】:

    没有。它是一个双向链表,但不是循环链表。见MSDN for details on this

    但是,

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

    【讨论】:

    • FWIW,证明它不是循环的doc语句可以在LinkedListNode<T>.Next Property)中找到:“对LinkedList中下一个节点的引用,或null如果当前节点是 LinkedList 的最后一个元素 (Last)。"
    【解决方案3】:

    如果您需要循环数据结构,请查看C5 generic collections library。他们有任何可以想象的有用的集合,包括circular queue(这可能会帮助你)。

    【讨论】:

      【解决方案4】:

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

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

      当前是LinkedListNode&lt;T&gt;

      【讨论】:

      • 这很漂亮。我喜欢它。
      【解决方案5】:

      虽然 LinkedList 的公共 API 不是循环的,但实际上它在内部是循环的。咨询reference source,可以看到它是如何实现的:

      // 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.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;
      }
      

      【讨论】:

      • 我知道这个问题很老了,但由于 .NET 的开源性是最近才出现的,我认为了解幕后发生的事情是件好事。
      猜你喜欢
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 2018-12-05
      • 2011-04-14
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多