Как добавить после того, как метод работает в связанном списке?
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 ответа:
Проблема здесь
while (current.Data != After) current = current.Next;
Когда в вашем списке нет "после", вы в конечном итоге получите
current.Next
равнымnull
Вам нужно проверить, если ток.Next-это не nullwhile (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);
Это сделает его работоспособным, но я бы все же настоятельно рекомендовал ознакомиться с реализацией связанных списков или использовать одну из системных коллекций, поскольку эта реализация имеет довольно много потенциальных проблем.