我从2天开始使用此页面上的代码Working with C# lists,当我尝试更改代码以将项目添加到上一项目之后的列表(而不是上一项目之前)时,我遇到了问题。
//ListNode constructor params: name, code, nextNode
//Insert element after the first element
public void InsertelementAfterTheFirst(object name, object code)
{
if (IsEmpty())
FirstNode = LastNode = new ListNode(name, code, null);
else
{
FirstNode = new ListNode(name, code, FirstNode);
}
}
我知道我可以使用“List<>”在C#中收集,但我的目的是了解列表的工作原理。
感谢您的帮助。
答案 0 :(得分:1)
这是伪代码......
if (firstNode is empty)
{
//new list...
firstNode = lastNode = new Node(name, code, null);
}
else
{
var node = new Node(name, code, firstNode.nextNode);
firstNode.nextNode = node;
}
唯一的问题是,这仅适用于在第一个节点之后添加节点。更好的方法可能是在InsertAfter方法中指定要将新节点附加到哪个节点。或者,如果您使用类似迭代器的模式(您的Linked List类具有Current节点),您可以执行类似的操作..只需获取当前节点,上面的else分支中的代码仍然可以工作(但是相反,firstNode,它将是currentNode)。
类似的东西:
public ListNode InsertAfterCurrent(object name, object code)
{
if (currentNode == null)
{
//assume new list
currentNode = firstNode = lastNode = new ListNode(name, code, null);
}
else
{
currentNode.NextNode = new ListNode(name, code, currentNode.NextNode);
}
}
public ListNode InsertAfter(ListNode anchor, object name, object code)
{
if (anchor != null && NodeIsPartOfList(anchor))
{
anchor.NextNode = new ListNode(name, code, anchor.NextNode);
}
}
public bool NodeIsPartOfList(ListNode node)
{
var current = firstNode;
while (current != null)
{
if (current == node)
return true;
current = current.NextNode;
}
return false;
}
答案 1 :(得分:-1)
在我回答这个问题之前,我觉得我应该提一下,在英语论坛上用西班牙语发布代码的情况很糟糕。我花了更多的时间来理解你的基本乱码,而不是写这篇文章。
此外,List<>
尽管命名不佳,但并未作为列表实现。它是数组的包装器,这就是.ToArray()
如此高效的原因。
现在针对您的具体问题,您希望将头链接设置为刚刚创建的节点,并将其下一个链接设置为上一个头链接:
if (EsVacio())
primerNodo = ultimoNodo = new ListNode(nom, cod, null);
else
{
var node=new ListNode(nom, cod, primerNodo);
node.Siguiente=primerNodo;
primerNodo=node;
}