这是通过简单地将指针设置为null来从c#中的链表中删除尾部的正确方法。我如何实际释放节点。我是否需要实现Idispose
public void DeleteTail()
{
if (head == null)
{
throw new InvalidOperationException("you cannot delete from an empty list.");
}
SingleLinkedListNode<T> current = head;
while (current.Next.Next != null)
{
current = current.Next;
}
//delete the node
current.Next = null;
}
//Appends a node to the linked list
public SingleLinkedListNode<T> AppendNode(T value)
{
SingleLinkedListNode<T> newNode = new SingleLinkedListNode<T>(value, null);
if (head == null)
{
head = newNode;
}
else
{
SingleLinkedListNode<T> current = head;
while (current.Next != null)
{
current = current.Next;
}
current.Next = newNode;
}
return newNode;
}
答案 0 :(得分:2)
除了将引用设置为null
之外,您无需执行任何操作。垃圾收集器将找不到对该对象的任何引用,因此它知道它不是活动对象并将释放内存。
如果您拥有非托管资源(例如数据库连接或文件句柄),则只需要实现IDisposable
。然后,当您不再需要时,应该在节点上显式调用Dispose
,以便尽快释放它所拥有的资源。
您还应该注意,您的程序中有错误。如果您的列表只包含一个元素,则该行将抛出NullReferenceException
:
while (current.Next.Next != null)
您还需要检查head.Next == null
。