我为此搜索了这么长时间,现在我已经走到了尽头。我有这个问题比这个项目更多,但我最终还是废弃了其他的。我有一个代码(C#),基本上我试图做霍夫曼树。有一次我这样做(“nodeList”是List(Node)):
Node node = new Node(nodeList[0], nodeList[1]);
nodeList.Add(node); // Adds a new node which includes two subnodes.
// Remove nodes from list (as they are now included in another node)
nodeList.RemoveAt(0);
nodeList.RemoveAt(1);
这里使用的构造函数是:
// Constructor that takes nodes
public Node(Node left, Node right)
{
leftNode = new Node(left);
rightNode = new Node(right);
}
// Constructor that only takes 1 single node
public Node(Node copy)
{
rightNode = copy.rightNode;
leftNode = copy.leftNode;
unencodedBits = copy.unencodedBits;
encodingValue = copy.encodingValue;
positions = copy.positions;
}
我做了第二个构造函数,希望它可以解决我的问题(认为从列表中删除节点可能会把它弄清楚。)(我的Node类中的所有值都在第二个的右侧)构造函数。)
问题:执行第二次“RemoveAt”后,Node将不再包含这两个节点。我无法理解为什么。我该怎么做才能防止这种情况发生?为什么会发生这种情况(所以我将来可以理解类似的情况)?
我可能忘了包含一些重要信息;如果我这样做,请告诉我。并感谢您的帮助。
答案 0 :(得分:1)
你的nodeList对象是数组还是List?如果它是一个列表,那么nodeList.RemoveAt(0)会使当前所在的节点和索引1现在位于索引0.所以你需要调用
nodeList.RemoveAt(0);
nodeList.RemoveAt(0);
而不是
nodeList.RemoveAt(0);
nodeList.RemoveAt(1);
见这里:http://msdn.microsoft.com/en-us/library/5cw9x18z(v=vs.110).aspx