我试图从链表中删除一个节点。下面是我试过的代码。
public class Node : IDisposable
{
public int Value { get; set; }
public Node Next { get; set; }
public Node(int value)
{
this.Value = value;
}
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
Next.Dispose();
}
}
}
public class LinkedList
{
Node head;
public void CreateList()
{
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
head = node1;
node1.Next = node2;
node2.Next = node3;
}
public void DeleteLastItem()
{
Node prevNode = head;
Node nextNode = head;
while (nextNode.Next != null)
{
prevNode = nextNode;
nextNode = nextNode.Next;
}
prevNode.Next = null;
nextNode.Dispose();
}
}
我想处理nextNode
(这只是最后一个节点)。并且它不会成为链表的一部分)。
当我尝试上面的代码,我得到下面的异常:
Unhandled Exception: System。NullReferenceException:对象引用没有设置为对象的实例。
我该怎么做呢?如何处理Node
对象?
在您的Dispose(bool)
方法中,您只能处置下一个节点,如果有一个。在尝试
protected virtual void Dispose(bool disposing) {
if (disposing) {
if (Next != null) {
Next.Dispose();
}
}
}
我想你应该在调用Dispose之前简单地检查Next是否不为空。
当在任何节点上调用Dispose方法时,您手动调用下一个,因此您将到达最后一个,next属性将为空,因此您得到此异常。
考虑到您给出的代码,我不明白为什么您需要您的节点是一次性的。只有当您使用非托管资源时才有必要,这在您给出的代码中不是这种情况(但也许您为问题简化了它)。
在Dispose逻辑中,检查NULL:
public class Node : IDisposable
{
public int Value { get; set; }
public Node Next { get; set; }
public Node(int value)
{
this.Value = value;
}
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (Next != null) // <-- new code here
{
Next.Dispose();
}
}
}
}