Как добавить после того, как метод работает в связанном списке? - PullRequest
2 голосов
/ 20 октября 2011
 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 для Add After определенного элемента, но при отладке он показывает ссылку на объект, не установленную для экземпляра исключения объекта. Пожалуйста, укажите мою ошибку в методе Find или в методе Add After. спасибо

Ответы [ 2 ]

3 голосов
/ 20 октября 2011
   current= first;
   while (current.Data != After)

может привести к потенциальной проблеме с нулевой ссылкой.first по-прежнему может быть установлен в null из инициализации конструктора, что будет означать, что current = null, что в результате приведет к null.Data, которая выдаст исключение нулевой ссылки.

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

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

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

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

В этом контексте LinkedList сначала инициализируется, current = Find(After) будет означать current = 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);

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

2 голосов
/ 20 октября 2011

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

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

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

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