【问题标题】:C# linked lists recursion?C#链表递归?
【发布时间】:2017-03-17 11:47:05
【问题描述】:

我问了一个关于链表的问题...我想我被误解了...我目前正在研究链表,我明白了这个概念,但我对节点的实现有点困惑。

public class Node
{
public Node Next;
public object Value;
}

如何使用“公共节点下一步;”在类节点内。换句话说,当您声明 Node 本身时,如何使用 Node 类型的 Next 对象?......这就像递归......是的,我知道递归是一种调用自身的方法......但是在在这种情况下,它是在类本身内部创建的同一类的对象......这就是为什么我说它类似于递归

【问题讨论】:

  • 是的,但在某个时刻,Next == null 会停止。
  • "你怎么能在类节点中使用"public Node Next;"你是什么意思?只有当您通过将它们一个接一个地链接在一起来启用它时,才会发生递归。那么问题是什么?
  • 回想一下,在 C# 中,所有类变量都是对堆上对象的引用(或 null)。
  • 递归是可选的,您可以通过迭代循环很容易地处理链表。真的不清楚你在这里问什么。
  • 我猜是有误会。如果您访问Next 属性,您将获得对下一个Node 实例的引用。但这不会自动将其称为Next-property。所以得自己调用,例如:object val = node.Next?.Next?.Value;

标签: c#


【解决方案1】:

C# 中的引用类型只存储对象的引用,而不是对象本身。因此,包含两个条目的链表如下所示:

+----------+
|  Node    |
+----------+
| Value: 1 |     +------------+
| Next: -------> |  Node      |
+----------+     +------------+
                 | Value: 2   |
                 | Next: NULL |
                 +------------+

而不是这样:

+---------------------+
|  Node               |
+---------------------+
| Value: 1            |
| Next: +-----------+ |
|       |  Node     | |
|       +-----------+ |
|       | ...       | |
|       +-----------+ |
+---------------------+

简而言之,public Node Next; 的意思是:存储对对象的引用,但让编译器确保该对象的类型为 Node 或其子类型。

【讨论】:

  • 查看 Lee 的评论问题...这就是我想问的问题
  • @Peter:最后一句话(我刚刚添加的)是否回答了你的问题?
  • @Heinzi -- 我很好奇,你是如何制作这些 ASCII 图表的?我一直在谷歌搜索,但无法确定。
  • @rory.ap:我手动绘制它们:我将部分缩进四个空格,以便以等宽字体打印,然后使用+- 和@987654327 @我键盘上的键。在过去的 usenet 时代,这是拥有图形的唯一方法,并且有些习惯会坚持下去。
【解决方案2】:

术语“递归”是指从自身调用函数或方法。你没有调用任何东西(还),所以递归在这里不是正确的术语。

指的是Node 类包含另一个Node。这在 C# 中是可能的。原因是Node是一个类,是一个引用类型。引用类型的字段或变量不包含类型本身,而是对类型的引用。引用也可以是null 引用,表示引用为空。由于您的 Next 属性继续引用下一个列表节点而不是节点本身,因此 Node 实例始终具有相同的大小,因此可以毫无问题地为它们分配内存。

如果您的Nodestruct,它将是一个值类型,这意味着Next 不会包含对下一个节点的引用,而是节点本身,它也将包含下一个节点和之后的下一个。值类型也不能是null,这样会导致循环布局,这也是禁止这种结构布局的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 2013-12-12
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多