在一个简单的单链表实现中,Node 类型包含对列表中下一项的引用,这就是您发布的Node 类型中的next 字段所做的。此引用用于允许列表的迭代。
封闭的LinkedList 类(或任何你想叫它的)将包含一个Node 对列表中第一项的引用。从第一个节点开始,您可以通过获取next 字段来逐步浏览列表。当next 为空时,您已到达列表的末尾。
以这段代码为例:
public class LinkedList
{
public class Node
{
// link to next Node in list
public Node next = null;
// value of this Node
public object data;
}
private Node root = null;
public Node First { get { return root; } }
public Node Last
{
get
{
Node curr = root;
if (curr == null)
return null;
while (curr.next != null)
curr = curr.next;
return curr;
}
}
}
First 属性只返回根节点,即列表中的第一个节点。 Last 属性从根节点开始遍历列表,直到找到next 属性为空的节点,表示列表结束。
这使得将项目附加到列表变得简单:
public void Append(object value)
{
Node n = new Node { data = value };
if (root == null)
root = n;
else
Last.next = n;
}
要删除一个节点,您必须在列表中找到它之前的节点,然后从 那个 节点更新next 链接以指向要删除的节点之后的节点:
public void Delete(Node n)
{
if (root == node)
{
root = n.next;
n.next = null;
}
else
{
Node curr = root;
while (curr.next != null)
{
if (curr.next == n)
{
curr.next = n.next;
n.next = null;
break;
}
curr = curr.next;
}
}
}
您还可以执行一些其他操作,例如在列表中的位置插入值、交换节点等。在节点之后插入很快,在之前插入很慢,因为您必须找到前一个节点。如果您真的想要快速“插入之前”,您需要使用双向链表,其中 Node 类型同时具有 next 和 previous 链接。
在评论中扩展您的问题...
在 C# 中,所有类型都分为两种基本分类:值类型和引用类型。名称反映了它们在代码块之间传递的方式:值类型通过值传递(值被复制到新变量),而引用类型通过引用传递(引用/指针被复制到新变量)。不同之处在于对值类型参数的更改不会影响调用者的值副本,而对引用类型参数的更改将反映在调用者的引用副本中。
赋值和引用变量也是如此。如下,b 变化时a 的值不变:
int a = 0;
int b = a;
b = 1;
这相当直观。可能会让您感到困惑的是,在 C# 中,struct 也是一个值类型:
public struct test
{
public string value;
}
static void Main()
{
test a;
a.value = "a";
test b = a;
b.value = "b";
Console.WriteLine("{0} {1}", a.value, b.value);
}
上面将给出输出a b,因为当您将a 分配给b 时,复制了一份。但是如果我们改变一个类的结构:
public class test
{
public string value;
}
static void Main()
{
test a = new test(); // Note the 'new' keyword to create a reference type instance
a.value = "a";
test b = a;
b.value = "b";
Console.WriteLine("{0} {1}", a.value, b.value);
}
因为变量b 是对相同 对象的引用,因为它与a 引用的一个变量相同,所以这里的输出将是b b。这两个变量引用同一个对象。
如果您来自 C/C++ 或其他类似语言,您可以将引用类型变量视为指针。它并不完全相同,C# 实际上确实有指针(它们对正常的托管代码是隐藏的),但它已经足够接近了。在您将其指向该类型的 instance 之前,它并不完全可用。就像 C/C++ 中的 char* 在您将其指向某个地方之前并不是特别有用。
Joseph Alhabari(写了一篇关于值和引用类型的精彩文章:C# Concepts: Value vs Reference Types。值得一读,就像他所写的大部分内容一样。我也强烈建议您考虑获取他的一篇C# Nutshell书。