LinkedList实施Bug

时间:2017-12-02 04:05:11

标签: c# data-structures linked-list

我试图在下面实现我的链接列表,只是当我使用我的链表时,似乎它在中间插入了一个空条目。有人可以看看吗?问题可能出在add end方法中。

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");

结果:(注意中间的空值)

c
b
a

a
e
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");

结果:(注意中间的空值)

c
b
a
a
c
b
a

a
e
d
b
a
e
d

1 个答案:

答案 0 :(得分:2)

初始化LinkedList时,您正在创建一个空节点:

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

此时你基本上有一个没有值的节点。这显示为空值。

每次拨打AddStart时,都会事先插入物品。在调用AddEnd时,您会在最后插入项目。由于您同等地调用这两个方法,因此初始节点似乎位于中间。

您可以通过将构造函数更改为:

来解决此问题
public LinkedList()
{
    Head = null;
}

或者完全删除构造函数。在这两种方法中,您都在检查带有值的Head节点,因此您无需在没有值的情况下对其进行初始化。

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

在当前状态下,您正在检查Head是否为空。 Head是Node类型,如果它是一个类,如果你在constrrocor(Head = new Node<T>(); //not null any longer)中初始化它,则不能为null。因此,您需要决定如何解决它。

就个人而言,我只是编写一个单元测试来断言我的逻辑并且实现是正确的。如果您在初始化后假设Head为null,请测试它:

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

在您的情况下,测试会失败,您可以将问题回溯到构造函数。