【问题标题】:NullReferenceException when trying to add item to end of singly linked list尝试将项目添加到单链表末尾时出现 NullReferenceException
【发布时间】:2020-03-14 18:51:29
【问题描述】:

我正在尝试将一个节点添加到单链表的末尾。但我不断收到 NullReferenceException。我已经尝试了一切,但我无法让它工作。代码背后的想法是继续循环遍历列表,直到我们到达 null(这标志着链表的末尾),然后我们在末尾添加一个新节点。 所以问题是我为什么会得到这个,我怎样才能让它工作?

您将在下面找到代码。

using System;
using System.Diagnostics;
using System.Threading;

namespace LinkedList
{
  public class Node<T> where T : IComparable
  {
    public T Value;
    public Node<T> Next { get; set; }

    public Node(T value, Node<T> next)
    {
      this.Value = value;
      this.Next = next;
    }
  }

  public class SortedLinkedList<T> where T : IComparable
  {
    public Node<T> start;

    public SortedLinkedList()
    {
      start = null;
    }

    public SortedLinkedList(Node<T> node)
    {
      start = node;
    }

    public void Insert(T value)
    {
      if ( this.start == null )
      {
        this.start = new Node<T>(value, this.start);
      }

      Node<T> curr = this.start;
      while ( curr != null )
      { curr = curr.Next;}
     curr.Next = new Node<T>(value,curr.Next);
    }
  }

  public class Program
  {
    public static void Main(string[] args)
    {
      var list =
        new SortedLinkedList<int>(
          new Node<int>(
            5, new Node<int>(
              7, new Node<int>(
                21, new Node<int>(
                  30, null)
                )
              )
            )
        );
      list.Insert(12);
      var list2 = new SortedLinkedList<string>();
      list2.Insert("hello");
    }
  }
}

【问题讨论】:

  • 感谢您的回复。我知道 NullReferenceException 是什么。我不知道为什么我在我的代码中得到它。

标签: c# .net list data-structures


【解决方案1】:

您必须重写 while 循环并检查 curr.Next 属性中的 null 值,否则循环结束后您将获得 null 作为 curr 值。

Node<T> curr = start;
while (curr.Next != null)
{ 
    curr = curr.Next; 
}
curr.Next = new Node<T>(value, curr.Next);

此外,您在列表末尾插入节点而不与现有节点进行比较。这意味着,尽管有 SortedLinkedList 类名称,但您的列表未排序。

要对列表进行排序,您应该在while 循环中逐一比较值以找到值的正确位置,或者如果找不到位置,则将其插入到末尾。类似的东西

var comparer = Comparer<T>.Default;
Node<T> curr = start;
var inserted = false;
while (curr.Next != null)
{
    if (comparer.Compare(curr.Value, value) < 0 && 
        comparer.Compare(curr.Next.Value, value) >= 0)
    {
        var previous = curr.Next;
        curr.Next = new Node<T>(value, previous);
        inserted = true;
        break;
    }
    curr = curr.Next;
}

if (!inserted)
    curr.Next = new Node<T>(value, curr.Next);

【讨论】:

  • 但是你要避免进入while循环如果curr == NULL :-(
  • @ChrisHall OP 在循环前将start 节点分配给curr,如果它为空则创建start 节点,如您在Insert 方法中所见
  • OP 然后继续追加节点的第二个副本:-( 所以需要将空列表的检测与开始扫描最后一个节点结合起来?
【解决方案2】:

看看这段代码:

  while ( curr != null )
  { curr = curr.Next;}

当curr 为null 时,循环结束,因此下一行您将在curr.Next 上获得空引用。请尝试以下操作:

while (curr.Next != null)
{
    curr = curr.Next;
}

【讨论】:

    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 2017-05-04
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    相关资源
    最近更新 更多