【发布时间】:2023-03-02 22:52:02
【问题描述】:
我已经使用 C# 实现了单链表。任何人都可以查看以下代码并提出我错的地方吗?
public int RemoveLast()
{
if (Head != null)
{
var curNode = Head;
while (curNode.Next != null)
{
curNode = curNode.Next;
}
var lastNodeValue = curNode.Value;
curNode = null;
Size--;
return lastNodeValue;
}
return -1;
}
此函数不会删除最后一个节点。我无法弄清楚出了什么问题。当 while 循环结束时,我们在 curNode 中获得了 next 为 null 的节点的引用。这意味着这是最后一个节点。最后,我将此节点设置为空。但是当我使用显示功能时。它也显示最后一个节点。这不是删除最后一个节点。
这是我的显示功能:
public string Display()
{
if (Head == null)
{
return string.Empty;
}
var curNode = Head;
var builder = new StringBuilder();
while (curNode.Next != null)
{
builder.Append($"{curNode.Value} ");
curNode = curNode.Next;
}
builder.Append($"{curNode.Value} ");
return builder.ToString();
}
【问题讨论】:
-
你只是在清除你的 currNode。它不会从列表中删除任何内容。预期的行为。您必须清除 倒数第二个 节点的
Next属性才能删除最后一个节点。 -
您不会将
.Next属性更改为 null。您只是将本地引用更改为 null。 -
我的猜测是 curNode 是 List 元素的本地副本。不是实际的列表元素。让 curNode 成为一个 var 使得它是什么类型变得模棱两可。您应该用明确的类型化来适当地替换它。 Taht 正是不应该使用 var 的那种情况。
-
尝试更改您的时间以检查
curNode.Next.Next == null并设置curNode.Next = null -
@SebastianL 如果 size = 1 怎么办?
currNode.Next.Next会抛出 NPE!
标签: c# singly-linked-list