如何添加后的方法在链表中工作

本文关键字:方法 链表 工作 何添加 添加 | 更新日期: 2023-09-27 18:11:44

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

这将修复AddFind方法以以下形式可用:

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