我试图在下面实现我的链接列表,只是当我使用我的链表时,似乎它在中间插入了一个空条目。有人可以看看吗?问题可能出在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
答案 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);
}
在您的情况下,测试会失败,您可以将问题回溯到构造函数。