I';我对在链表前面添加节点感到困惑。(C#)

I';我对在链表前面添加节点感到困惑。(C#),c#,linked-list,C#,Linked List,这是给我的一个节点的实现: public class IntNode { private int value; private IntNode next; public IntNode(int value) { this.value = value; this.next = null; } public IntNode(int value, IntNode next) { this.val

这是给我的一个节点的实现:

public class IntNode
{
    private int value;
    private IntNode next;

    public IntNode(int value)
    {
        this.value = value;
        this.next = null;
    }

    public IntNode(int value, IntNode next)
    {
        this.value = value;
        this.next = next;
    }

    public int GetValue()
    {
        return value;
    }

    public IntNode GetNext()
    {
        return next;
    }

    public void SetValue(int value)
    {
        this.value = value;
    }

    public void SetNext(IntNode next)
    {
        this.next = next;
    }

    public override String ToString()
    {
        return value + "-->" + next;
    }
}
至于添加到列表的开头,我得到了一个代码,将节点q添加到列表的开头,列表的开头首先从节点开始。这就是代码:

IntNode q = new IntNode(value);
q.SetNext(first);
first=q;
问题是,我不明白为什么最后一行是必要的。为什么首先要指出q的值?如果我们想将q添加到列表中,我们不应该让它指向原始的第一个节点吗?我在几家网站上查过这个算法,他们都把这条线当作一个明显的例子,没有解释原因。我试图在列表的开头添加一个新节点,但故意省略了这一行,效果非常好(通过将列表打印到控制台,我看到q在第一个节点之前成为了第一个节点)

如果有人能解释,我会很高兴:)

(我只是一个新手程序员,所以我为我可能犯的任何错误提前道歉)

为什么首先要指出q的值

因为我们正在将节点添加到列表的开头,所以它现在应该是链接列表中的第一个节点
q
是一个新添加的节点,我们将它的下一个节点设置为
第一个
,这很好,但是现在我们的
第一个
元素是
q
,因为您在链接列表的前面添加了一个元素,这意味着这里是链接列表的开始

您可以使用更好的变量名对代码进行如下调整,以便于理解,我想这就是您真正想要的:

IntNode newNode = new IntNode(value); //create elemeent
currentNode.SetNext(newNode); // add it next to current element
currentNode = newNode; // now newNode is CurrentNode as next element will be linked with newNode

希望有帮助。

当您在列表的开头添加一个节点
q
时,会发生两件事:

  • 原始的第一个节点成为
    q的“下一个节点”
  • q
    成为第一个节点
  • 通过这样做:

    q.SetNext(first);
    
    你只是在表演第一。您还需要执行数字2,使
    q
    成为第一个,因此

    first = q;
    
    我们不应该让它指向最初的第一个节点吗

    你是说只做第二行


    如果执行此操作,变量
    first
    now将引用第二个节点(实际的第一个节点是
    q
    now!),这没有任何意义。

    铅笔和纸在试图弄清楚发生了什么时会产生奇迹。由于您将q添加到列表的前面,因此first不再是列表的前面。计算机是哑的,它们不会推断变量first意味着列表中的第一项,并神奇地更新程序员忘记的东西。因此,程序员必须添加一行,告诉计算机列表中的第一项已更改。因此,如果我理解正确,这只是语义问题?(也就是说,没有那一行代码仍然可以很好地工作,但是我们希望名称first,或head,或其他任何东西指向实际的第一个节点,以便使用它更加有序和合乎逻辑?@blablabla是的,它只是语义。但是,如果您忘记了
    first
    实际上是指第二个节点,那么就写
    Console.WriteLine(首先)
    ,希望它打印
    q
    的值,您会失望的。