我正在使用一个简单的链接列表。我正在尝试创建一个方法,将项目插入到我的链接列表的前面。
此方法有效:
// Works
public static LinkedListNode AddItemAtFrontWorkingVersion(LinkedListNode node, int value)
{
var newNode = new LinkedListNode(value);
newNode.next = node;
return newNode;
}
被叫:
LinkedListNode a = new LinkedListNode(5);
a = LinkedListNode.AddItemAtFrontWorkingVersion(a, 99);
现在我有一个不同的版本,它不起作用,我无法弄清楚原因。该列表是一个对象,所以它应该在堆上,为什么我只能设置到新节点。当方法返回时,它不会更改。
问题:为什么我必须返回节点为什么我不能像在AddItemAtEnd那样分配它?
// Does Not work
public static void AddItemAtFront(LinkedListNode node, int value)
{
var newNode = new LinkedListNode(value);
newNode.next = node;
node = newNode;
}
被叫:
LinkedListNode a = new LinkedListNode(5);
LinkedListNode.AddItemAtFront(a, 99);
完整代码:
using System;
namespace DataStructure
{
public class LinkedListNode
{
public int value;
public LinkedListNode next;
public LinkedListNode(int value)
{
this.value = value;
}
public static void AddItemAtEnd(LinkedListNode node, int value) {
var list = node.next;
while (node.next != null)
{
node = node.next;
}
node.next = new LinkedListNode(value);
}
// Does Not work
public static void AddItemAtFront(LinkedListNode node, int value)
{
var newNode = new LinkedListNode(value);
newNode.next = node;
node = newNode;
}
// Works
public static LinkedListNode AddItemAtFrontWorkingVersion(LinkedListNode node, int value)
{
var newNode = new LinkedListNode(value);
newNode.next = node;
return newNode;
}
}
class Program
{
static void Main(string[] args)
{
LinkedListNode a = new LinkedListNode(5);
LinkedListNode.AddItemAtFront(a, 99);
a = LinkedListNode.AddItemAtFrontWorkingVersion(a, 99);
LinkedListNode.AddItemAtEnd(a, 9);
LinkedListNode.AddItemAtEnd(a, 10);
LinkedListNode.AddItemAtEnd(a, 11);
LinkedListNode.AddItemAtEnd(a, 12);
LinkedListNode.AddItemAtFront(a, 99);
a = LinkedListNode.AddItemAtFrontWorkingVersion(a, 99);
Console.Read();
}
}
}
答案 0 :(得分:1)
您按价值传递LinkedListNode
。要使您的第二个版本正常工作,您必须通过引用传递它。
public static void AddItemAtFront(ref LinkedListNode node, int value)
{
var newNode = new LinkedListNode(value);
newNode.next = node;
node = newNode;
}
可在文档中找到更多详细信息:Passing Reference-Type Parameters 。