【问题标题】:C# best approach to add new item in existing LinkedList<T>?C# 在现有 LinkedList<T> 中添加新项目的最佳方法?
【发布时间】:2017-05-21 15:15:23
【问题描述】:

我正在尝试在现有链接列表中添加新电影名称,但出现错误。

cannot convert from 'string' to 'System.Collections.Generic.LinkedListNode<string>'

这是我正在处理的代码:

 LinkedList<string>  movies = new LinkedList<string>();
       movies.AddLast("Fire & Dew");
       movies.AddLast("Hang Break");
       movies.AddLast("Naughty Monkey");
       movies.AddLast("Sabotage");  

     //Add movie name Good & Bad After Hang Break
     movies.AddAfter("Hang Break", "Good & Bad");

        foreach (string movie in movies)
       {
           Console.WriteLine(movie);
       }    

任何解决方案和代码提示?

【问题讨论】:

  • 对于双向链表中的每个元素,您需要对下一个和上一个项目进行引用。您需要一个单独的类型来封装元素。该类型是 LinkedListNode.
  • 您使用链表而不是其他集合类型的任何特殊原因?
  • 规则 #1:永远不要使用 LinkedList。规则#2:正确使用它,AddAfter() 需要一个节点,而不是一个字符串。让它与字符串一起工作会使它比现在更糟,你必须再次迭代集合才能找到节点。请改用 List。
  • Linked List 提供了一种替代集合,在您需要非常频繁地从集合中添加或删除项目的情况下,它可以提供更好的性能。
  • 这是一个很常见的误解。找到插入点比在 List 中插入元素的成本更多。 LinkedList 对现代处理器非常不友好,它的缓存局部性很差。只有在不丢失节点引用(实际上是 OP 忘记做的事情)的情况下,您才能领先。

标签: c# list linked-list


【解决方案1】:

AddAfter类型签名是:

public LinkedListNode&lt;T&gt; AddAfter(<b>LinkedListNode&lt;T&gt; node</b>, T value)

所以第一个参数node 应该是LinkedListNode&lt;T&gt;。您可以获取该节点,因为它是从AddLast 方法返回的:

movies.AddLast("Fire & Dew");
var hang_break = movies.AddLast("Hang Break");
movies.AddLast("Naughty Monkey");
movies.AddLast("Sabotage");  

//Add movie name Good & Bad After Hang Break
movies.AddAfter(hang_break, "Good & Bad");

csharp 交互式 shell 中评估此代码后,我们得到:

csharp> movies
{ "Fire & Dew", "Hang Break", "Good & Bad", "Naughty Monkey", "Sabotage" }

之所以需要这样做是因为这样的链表允许在 O(1) 中的 given 节点旁边插入,因为它修改了下一个和上一个的引用节点。这是可以做到的,因为它只需要改变给定节点和给定节点旁边的节点。但是,如果您首先需要搜索节点,则算法是 O(n),因此将失去链表的性能优势。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2013-02-21
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多