NullReferenceException при попытке добавить элемент в конец односвязного списка - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь добавить узел в конец односвязного списка. Но я продолжаю получать NullReferenceException. Я перепробовал все, но не могу заставить его работать. Идея, лежащая в основе кода, состоит в том, чтобы продолжать циклически проходить по списку до тех пор, пока мы не достигнем нуля (который отмечает конец связанного списка), а затем добавить новый узел в конец. Итак, вопрос в том, почему я получаю это и как я могу заставить его работать?

Ниже вы найдете код.

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");
    }
  }
}

Ответы [ 2 ]

4 голосов
/ 14 марта 2020

Вы должны переписать ваше while l oop и проверить curr.Next для значения null, в противном случае после завершения l oop вы получите null как curr значение

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

Кроме того, вы вставляете узел в конец списка без сравнения с существующими узлами. Это означает, что ваш список не отсортирован, несмотря на SortedLinkedList имя класса.

Чтобы отсортировать список, вы должны сравнить значения одно за другим в while l oop, чтобы найти правильное место для значение или вставьте его до конца, если место не найдено. Нечто подобное

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);
3 голосов
/ 14 марта 2020

Посмотрите на этот фрагмент кода:

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

Здесь l oop заканчивается, когда curr равно null, поэтому на следующей строке вы получите нулевую ссылку на curr.Next. Попробуйте следующее:

while (curr.Next != null)
{
    curr = curr.Next;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...