C# - 链接列表实现

时间:2017-05-25 08:10:46

标签: c# singly-linked-list

好的,所以我正在进行编程练习,我必须为FIFO链接列表编写自己的实现。我有一套我试图满足的单元测试。到目前为止,我的实施工作得相当好。然而,我面临的问题是Next属性。

在Unittests中,他们希望能够像这样调用Next属性。

  

List.Next.Next.Value

     

List.Next.Value

等。如果有人调用Next,我的实现将返回整个类实例,但是当有人在多个语句中调用Next时,第二个语句将不再具有新实例并且测试失败。

我的实施:

using System.Collections;
using System.Collections.Generic;

public class SimpleLinkedList<T> : IEnumerable<T>
{
    public class Node
    {
        public T Data { get; set; }
        public Node Next { get; set; }
    }

    private Node First = null;
    private Node Last = null;

    public SimpleLinkedList(T value)
    {
        AddNode(value);
    }

    public SimpleLinkedList(IEnumerable<T> values)
    {
        foreach (var value in values)
        {
            AddNode(value);
        }
    }

    public T Value {
        get {
            return First != null ? First.Data : default(T);
        }
    }

    public SimpleLinkedList<T> Next {
        get {
            if (First.Next != null)
            {
                First = First.Next;
                return this;
            }
            return null;
        }
    }

    public SimpleLinkedList<T> Add(T value)
    {
        AddNode(value);
        return this;
    }

    public IEnumerator<T> GetEnumerator()
    {
        var current = First;
        while (current.Next != null)
        {
            yield return First.Data;
            current = current.Next;
        }
    }

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

    void AddNode(T value)
    {
        Node _newNode = new Node() { Data = value };
        if (First == null)
        {
            First = _newNode;
            Last = First;
        }
        else
        {
            Last.Next = _newNode;
            Last = Last.Next;
        }
    }
}

单元测试失败:

[Fact]
public void From_enumerable()
{
    var list = new SimpleLinkedList<int>(new[] { 11, 7, 5, 3, 2 });

    Assert.Equal(11, list.Value);
    Assert.Equal(7, list.Next.Value);
    Assert.Equal(5, list.Next.Next.Value);
    Assert.Equal(3, list.Next.Next.Next.Value);
    Assert.Equal(2, list.Next.Next.Next.Next.Value);
}

单元测试在断言5上失败。因为在它之前的语句中,已经调用了Next,并且已经改变了对象的状态。

我试过保持一个内部&#39;当前&#39;返回的财产而不是第一个。但后来我遇到了问题,我怎么知道何时重启Current? 我不知道如何从这里开始。

0 个答案:

没有答案