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;
}
}
}
我为Add After特定元素实现了Find方法,但是当我调试它时,显示我对象引用没有设置为对象异常的实例。请指出我在查找方法或添加后方法中的错误。由于
current= first;
while (current.Data != After)
可能导致潜在的空引用问题。First仍然可以在构造函数初始化时设置为null,这意味着current = null,这将导致null。会抛出空引用异常的数据。
这将修复Find() 中的null引用问题。 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);
这将使它可行,但我强烈建议阅读链表的实现或使用一个系统集合,因为这个实现有相当多的潜在问题。
问题在这里
while (current.Data != After)
current = current.Next;
当你的列表中没有After时,你最终会得到current.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;
}