C# · 12月 26, 2021

c# – 链接列表:添加元素时为什么是current.Next指向新节点,为什么我们要覆盖当前节点

我是C#的初学者,我通过解决数据结构案例场景来解决它.我需要帮助可视化以下代码段中发生的事情 public void AddAtLast(object data){ Node newNode = new Node(); newNode.Value = data; current.Next = newNode; current = newNode; Count++;}

我明白了什么部分

我知道在链表的末尾添加了一个新节点.此外,新节点从函数参数获取其值.

我需要帮助的是什么

我特别想到为什么current.Next指向newNode,不应该指向NULL,因为我的newNode将被放置在链表的末尾,所以它应该指向NULL.

另外,我们为什么要做current = newNode?

我理解为什么计数存在可能是因为想要跟踪添加新元素的位置,但如果我的理解错误,请纠正我.

解决方法 因此,让我们看看在 Linked List类的AddAtLast(对象数据)方法中逐行发生的事情

>节点newNode = new Node();

创建一个新的Node,这是生活中AddAtLast方法的目标

> newNode.Value = data;

将一些数据分配给节点

> current.Next = newNode;

将创建的newNode分配给Current.这是链接列表的链接部分

> current = newNode;

覆盖当前(这看起来很奇怪)以后会对此进行更多的解释.

>数

增加链表的计数,很高兴知道列表的大小,而不必遍历其所有元素.这只是一个总是知道计数的简单方法.

你要记住的第一件事

在C#(和许多其他语言)中,对象/类是Reference Type.当您创建Current(或任何其他对象/类)时,您正在做两件事.

>保留内存的物理部分并使用新对象填充它
>为该内存创建一个引用(又名Address,aka Pointer).想想地址就像Post-It-Note一样存在于你家里的某个地方.

当你覆盖一个引用时,你实际上并没有破坏内存,就像你在Post-It-Note上写下地址并写下其他内容一样.你的鞋仍然住在橱柜里.在.Net中唯一的例外是,如果没有更多的引用留给你的对象/类,Garbage Collector(你的妈妈)会来清理并丢弃它.

通过调用current = newNode;看起来我们刚刚丢失了覆盖它,并丢失了对该节点的所有引用(我们上次跟踪),但我们没有.

要记住的第二件事

投资到Linked List的Clever-Clogs知道我们必须以某种方式跟踪项目,因此他们设想在添加Node时,某个其他节点需要有一个链接到它.

这就是这行代码(current.Next = newNode)的全部内容.确保它实际链接在列表中.是的,所以我们覆盖了它,但我们现在知道,当其他人正在引用节点时,它不会被清除.另外,如果我们想再次找到它,我们所要做的就是找到第一个Node并遍历链接.

另一种思考方式

将Current视为一个存储桶,在该存储桶中有一个节点,在该节点上是一张名为next的纸.

>有人递给你一个新节点.
>你刻意地在你当前拥有的节点上写下这个新节点的名字(有人给我们)(每个节点都有Next / Link Post-It-Note)
>您将水桶放在地板上,然后将新节点放入水桶中.

但你必须记住,你提示的Node仍然在某个地方(实际上,可能还有另一个Node上有它的名字,就像你在它上面写了新的Nodes新名字一样).虽然,我们无法轻易访问它们,但如果我们遍历链接,它们仍然存在

从本质上讲,这就是链接列表的工作方式,它只是一堆节点,其上写有其他节点名称.

我们使用封装此逻辑的类中的Current / Temp和First / Head(Buckets)等工具跟踪列表.有时我们有一个Count可以更容易地知道我们跟踪的节点数量.尽管如此,链接列表中最重要的部分是First / Head存储桶.没有它我们就无法遍历这个清单.

原始方法中的Current / Temp只是让我们很容易找到最后一个节点,因此您不必遍历列表来查找它