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?
解决方法
>节点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只是让我们很容易找到最后一个节点,因此您不必遍历列表来查找它
例