2017-12-02 9 views
0

아래 링크 된 목록을 구현하려고했습니다. 링크 된 목록을 사용했을 때 중간에 null 항목이 삽입 된 것 같습니다. 누구든지 살펴볼 수 있습니까? 문제는 추가 끝 방법에있을 수 있습니다.LinkedList 구현 버그

LinkedList<T> 

    public class LinkedList<T> : IEnumerable<T> 
    { 
     public Node<T> Head { get; set; } 
     public int Count { get; set; } 

     public LinkedList() 
     { 
      Head = new Node<T>(); 

     } 

     public void AddStart(T data) 
     { 
      if (Head == null) 
      { 
       Head = new Node<T> {Value = data}; 

      } 
      else 
      { 
       var newNode = new Node<T> {Value = data, Next = Head}; 
       Head = newNode; 
      } 

      Count++; 
     } 

     public void AddEnd(T data) 
     { 
      var newNode = new Node<T> { Value = data, Next = null}; 
      var current = Head; 
      if (Head == null) 
      { 
       Head = newNode; 
      } 
      else 
      { 
       while (current.Next != null) 
       {      
        current = current.Next; 
       } 
       current.Next = newNode;     
      } 
     } 


     public IEnumerator<T> GetEnumerator() 
     { 
      Node<T> current = Head; 
      while (current != null) 
      { 
       yield return current.Value; 
       current = current.Next; 
      } 
     } 

     IEnumerator IEnumerable.GetEnumerator() 
     { 
      return GetEnumerator(); 
     } 
    } 

사용법 :

LinkedList<string> strings = new LinkedList<string>();    
    strings.AddStart("a"); 
    strings.AddStart("b"); 
    strings.AddStart("c"); 
    strings.AddEnd("a"); 
    strings.AddEnd("e"); 
    strings.AddEnd("d"); 

결과 :

LinkedList<string> strings = new LinkedList<string>(); 
strings.AddStart("a"); 
strings.AddStart("b"); 
strings.AddStart("c"); 
strings.AddEnd("a"); 
strings.AddEnd("e"); 
strings.AddEnd("d"); 
strings.AddStart("a"); 
strings.AddEnd("b"); 
strings.AddStart("a"); 
strings.AddStart("b"); 
strings.AddStart("c"); 
strings.AddEnd("a"); 
strings.AddEnd("e"); 
strings.AddEnd("d"); 

결과 :합니다 (에 널 (null)을 주목

c 
b 
a 

a 
e 
d 

사용법 (중간에 널 (null)을 주목하라) 중간)

당신은 기본적으로 값을 사용하지 않고 노드가이 시점에서

public LinkedList() 
{ 
    Head = new Node<T>(); 
} 

: 당신이 당신의 LinkedList의를 초기화 할 때

c 
b 
a 
a 
c 
b 
a 

a 
e 
d 
b 
a 
e 
d 

답변

2

당신은 빈 노드를 만들 수 있습니다. 이것은 빈 값으로 표시됩니다.

AddStart을 호출 할 때마다 손쉽게 항목을 삽입합니다. AddEnd으로 전화 할 때는 마지막에 항목을 삽입하십시오. 두 메소드를 동등하게 호출하기 때문에 초기 노드가 중간에있는 것처럼 보입니다.

이에 생성자를 변경하여이 문제를 해결할 수 있습니다

public LinkedList() 
{ 
    Head = null; 
} 

또는 alltogether 생성자를 제거합니다. 두 가지 방법 모두 값이있는 헤드 노드를 확인하므로 값없이 헤드 노드를 초기화 할 필요가 없습니다.

if (Head == null) 
{ 
    Head = new Node<T> {Value = data}; 
} 

현재 상태에서 Head이 null인지 확인하고 있습니다. Head 유형이 Node이고, 클래스 인 경우 constrcutor (Head = new Node<T>(); //not null any longer)에서 초기화하면 null이 될 수 없습니다. 그래서 당신은 당신이 그것을 어떻게 풀고 싶은지에 대해 마음을 정해야합니다.

개인적으로 저는 제 논리를 단언하기 위해 단위 테스트를 작성하고 구현이 정확합니다. 당신이 머리가 초기화 이후에 시험 널 (null)이라고 가정하면 : 귀하의 경우

[Fact] 
public void AssertHeadIsNull() 
{ 
    var list = new LinkedList<int>(); 
    Assert.Null(list.Head); 
} 

, 테스트가 실패했을 것이다, 당신은 당신의 생성자에 문제를 역 추적 할 수 있었다.

+0

빠르고 정확했습니다. 나는 그것이 매우 기초적이라고 믿을 수없고 당혹 스럽다. 설명 주셔서 감사합니다! 좋은 하루 되세요. – Sherwin

+0

우리 모두는 같은 시점에 여러 번 붙어 있습니다. 당혹 스러울 것이 없습니다. – Marco