You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何GoToNextNode函数无法修改传入的链表Node对象?

为什么调用GoToNextNode后链表节点没切换?

这是个非常典型的C#参数传递误区,咱们一步步拆解问题根源,再给出解决办法:

首先先还原你遇到问题的代码:

public static void GoToNextNode(Node<int> head) 
{ 
    head = head.GetNext(); 
}

// 主函数代码
Node<int> a1 = new Node<int>(5); 
Node<int> a2 = new Node<int>(5,a1); 
GoToNextNode(a2); 
// 执行后发现a2还是原来的节点,并没有切换到a1

问题根源:引用类型的按值传递

你可能以为引用类型传参就是直接操作原对象,但在C#里,引用类型的参数默认是按值传递的——这里的“值”指的是引用本身。也就是说,函数里的head变量是你传入的a2引用的一个副本。当你在函数里执行head = head.GetNext()时,只是把这个副本的指向改成了下一个节点,但主函数里的a2这个原引用完全没被改动,所以函数执行完后,a2自然还是指向原来的节点。

两种可行的解决方案

方案1:让函数返回下一个节点的引用

最简单的方式就是修改函数,让它返回新的节点引用,然后在主函数里把返回值赋值给原变量:

public static Node<int> GoToNextNode(Node<int> head) 
{ 
    return head.GetNext(); 
}

// 主函数调用时接收返回值
a2 = GoToNextNode(a2); 
// 现在a2就会正确指向a1了

方案2:使用ref关键字实现按引用传递

如果不想用返回值的方式,可以用ref关键字让参数真正按引用传递,这样函数里对head的修改会直接作用于主函数里的原变量:

public static void GoToNextNode(ref Node<int> head) 
{ 
    head = head.GetNext(); 
}

// 主函数调用时必须加上ref关键字
GoToNextNode(ref a2); 
// 执行后a2会成功切换到下一个节点

内容的提问来源于stack exchange,提问作者Emanuel L

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:37:53