2011-10-20 4 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 메서드 나 Add After 메서드에서 저의 실수를 지적하십시오. 감사합니다.링크 된 목록에서 애프터 메쏘드가 어떻게 작동합니까?

+1

숙제? 그렇지 않다면'List '를 사용하십시오. – Vlad

+0

불필요한'ListNode' 초기화 중 일부를 제거하는 것이 좋습니다. 즉 변화'현재 = 찾기 (후),' ListNode 전류'에 = (후) 찾기,'당신'새 = 현재 ListNode()를 ListNode 제거 할 수 which'd;'등 –

답변

2

문제는 여기

while (current.Data != After) 
     current = 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 참조 문제가 발생할 수 있습니다. 최초로 생성자의 초기화로부터 null를 설정할 수 있습니다. 즉, 현재의 null가 null가되어, null 참조 예외가 슬로우되는 null가됩니다.

이 아직도 이러한 맥락에서 Add

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

, LinkedList에 문제가 발생할 것이다 반환되는 null을 초래이 고정 찾기에 null 참조 문제()

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

를 해결하는 것 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); 

하지만 그러나 매우 링크의 구현에 읽어 보시기 바랍니다 것이다 이 구현은 꽤 많은 잠재적 인 문제가 있으므로 시스템 콜렉션 중 하나를 사용하거나 목록을 사용합니다. 더 후 목록에서 당신은 결국 당신은 current.Next null가 아닌 경우 확인해야 null 에 동일한 current.Next를 얻을 것이다이없는 경우

관련 문제