这是从c#中的链表中删除尾部的正确方法吗?

时间:2011-10-15 05:36:19

标签: c#

这是通过简单地将指针设置为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;
    }

1 个答案:

答案 0 :(得分:2)

除了将引用设置为null之外,您无需执行任何操作。垃圾收集器将找不到对该对象的任何引用,因此它知道它不是活动对象并将释放内存。

如果您拥有非托管资源(例如数据库连接或文件句柄),则只需要实现IDisposable。然后,当您不再需要时,应该在节点上显式调用Dispose,以便尽快释放它所拥有的资源。


您还应该注意,您的程序中有错误。如果您的列表只包含一个元素,则该行将抛出NullReferenceException

while (current.Next.Next != null)

您还需要检查head.Next == null