2011-10-20 50 views
2
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方法中指出我的錯誤。謝謝如何在方法在鏈接列表中工作後添加?

+1

作業?如果沒有,只需使用'List '。 – Vlad

+0

您可能想要考慮擺脫一些不需要的'ListNode'初始化。即改變'current = Find(After);' 爲'ListNode current = Find(After);'which'd允許你擺脫'ListNode current = new ListNode();'等 –

回答

2

問題是在這裏

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

當沒有在列表中後,你最終會得到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; 
    } 
+0

仍然存在相同的問題 –

3
current= first; 
    while (current.Data != After) 

可能會導致潛在的空引用問題。首先仍然可以從構造函數初始化設置爲null,這意味着current = null,然後導致null.Data,這將拋出一個空引用異常。

這將解決在查找()的空引用問題

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

這會同時修改AddFind方法是在形式可用:

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

這將使它能夠發揮作用,但我卻強烈建議你閱讀到的鏈接的實現列出或使用其中一個系統集合,因爲此實現具有相當多的潛在問題。