Как добавить после того, как метод работает в связанном списке?


 class ListNode
{
    public object Data { get; private set; }

    public ListNode Next { get; set; }

    public ListNode(object Element)
    {
        Data = Element;
    }

    public ListNode(object Element, ListNode NextNode)
    {
        Data = Element;
        Next = NextNode;
    }

    public ListNode()
    {

    }
}

 class LinkedList
{
    ListNode first;
    ListNode last;

    public LinkedList()
    {
        first = null;
        last = null;
    }


   public ListNode Find(object After)
    {
        ListNode current = new ListNode();
        current= first;
        while (current.Data != After)
        current = current.Next;
        return current;
    }

   public void Add(object newItem, object After)
   {
       ListNode current=new ListNode();
       ListNode newNode=new ListNode();
       current = Find(After);
       newNode.Next = current.Next;
       current.Next = newNode;
   }

    public void InsertAtFront(object Element)
    {
        if (IsEmpty())
        {
            first = last = new ListNode(Element);
        }
        else
        {
            first = new ListNode(Element,first);
        }
    }

    bool IsEmpty()
    {
        return first == null;
    }

    public void Display()
    {
        ListNode current = first;
        while (current!=null)
        {
            Console.WriteLine(current.Data);
            current = current.Next;
        }           
    }
}

Я реализую метод Find для добавления после определенного элемента, но при отладке он показывает мне ссылку на объект, не заданную для экземпляра исключения объекта. Пожалуйста, укажите на мою ошибку в методе Find или с помощью метода Add After. спасибо

2 2

2 ответа:

Проблема здесь

while (current.Data != After)
      current = current.Next;

Когда в вашем списке нет "после", вы в конечном итоге получите current.Next равным null Вам нужно проверить, если ток.Next-это не null

   while (current.Next != null && current.Data != After)
      current = current.Next;

Вы также должны исправить свою логику добавления (если вы хотите добавить элементы в пустой список)

   public void Add(object newItem, object After)
   {
       if(IsEmpty())
       {
            InsertAtFront(newItem);
            return;
       }

       ListNode newNode=new ListNode();
       newNode.Data = newItem; 
       ListNode current = Find(After);
       newNode.Next = current.Next;
       current.Next = newNode;
   }
   current= first;
   while (current.Data != After)

Может привести к потенциальной проблеме нулевой ссылки. первый все еще может быть установлен в null из инициализации конструктора, что будет означать, что current = null, что затем приведет к null.Данные, которые вызвали бы исключение null reference.

Это исправит проблему нулевой ссылки в Find ()

   while (current != null && current.Data != After)

Исправление этого приведет к возвращению null, что все равно приведет к проблемам в Add

   current = Find(After);
   newNode.Next = current.Next;
   current.Next = newNode;

В этом контексте LinkedList сначала инициализируется, current = Find(After) это будет означать current = null, что вызовет еще одно исключение null-ссылки в следующих двух строках.

    public void Add(object newItem, object After)
    {
        if (IsEmpty())
        {
            InsertAtFront(newItem);
            return;
        }

        ListNode newNode = new ListNode();
        ListNode current = Find(After);
        newNode.Next = current.Next;
        current.Next = newNode;
    }

Это исправит оба метода Add и Find, которые будут использоваться в виде:

    LinkedList list = new LinkedList();
    list.InsertAtFront("test");
    list.Find(list.first.Data);
    list.Add("test2", ll.first.Data);

Это сделает его работоспособным, но я бы все же настоятельно рекомендовал ознакомиться с реализацией связанных списков или использовать одну из системных коллекций, поскольку эта реализация имеет довольно много потенциальных проблем.