【问题标题】:Linked Lists : When adding a element why is current.Next pointing to the new Node, and why do we overwrite the Current Node链表:添加元素时为什么是 current.Next 指向新节点,为什么要覆盖当前节点
【发布时间】:2018-10-26 10:44:57
【问题描述】:

我是 C# 的初学者,我通过解决数据结构案例场景来学习它。我需要帮助可视化以下代码 sn-p 中发生的事情

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

我理解为什么出现count++ 可能是因为它想跟踪添加新元素的位置,但如果我的理解有误,请纠正我。

【问题讨论】:

    标签: c# data-structures linked-list


    【解决方案1】:

    那么让我们逐行看看Linked List 类的AddAtLast(object data) 方法中发生了什么

    1. Node newNode = new Node();

    创建一个新的节点,这是AddAtLast方法的人生目标

    1. newNode.Value = data;

    节点分配一些数据

    1. current.Next = newNode;

    将创建的newNode 分配给Current。这是 Linked List

    Linked 部分
    1. current = newNode;

    覆盖Current(这一定很奇怪);稍后我会详细解释。

    1. Count++

    增加Linked ListCount,很高兴知道列表的大小,而不必遍历其所有元素。这只是一种始终知道计数的简便方法。


    你必须记住的第一件事

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

    1. 保留内存的物理部分并用新对象填充它
    2. 创建对该内存的引用(又名地址,又名指针)。可以将地址想象成 Post-It-Note 来表示您家中某处存在的东西。

    当您覆盖引用时,实际上并不会破坏内存,就像您在便利贴上潦草地写下地址并写下其他内容一样。你的鞋子还在柜子里。 .Net 中唯一的例外是,如果没有更多对您的对象/类的引用,Garbage Collector(您的妈妈)会来清理并丢弃它。

    通过调用current = newNode;,似乎我们只是丢失了覆盖它,并且丢失了对该节点的所有引用(我们上次跟踪),但我们没有。


    要记住的第二件事

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

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


    另一种思考方式

    Current想象成一个桶,在那个桶里有一个Node,在那个Node上有一张纸叫做next。

    1. 有人递给你一个新的节点
    2. 您特意将这个新节点的名称(有人给我们的)写在您当前在存储桶中的 Node 上(每个节点都有的Next/Link Post-It-Note)李>
    3. 您将桶倒在地板上,然后将新的节点放入桶中。

    但是你必须记住,你提示的 Node 仍然在某个地方(事实上,可能还有另一个 Node 上面也有它的名字,就像你写你的新 Nodes it 上的新名称)。虽然,我们无法轻松访问它们,但如果我们遍历 Linkages

    ,它们仍然存在

    本质上,这就是链表的工作方式,它只是一堆节点,上面写着其他节点名称。

    我们使用封装此逻辑的类中的Current/TempFirst/Head(Buckets)等工具来跟踪列表。有时我们有一个Count,以便更容易知道我们正在跟踪多少个节点。虽然确实,Linked List 中最重要的部分是 First/Head 存储桶。没有它,我们无法遍历列表。

    Current/Temp在你原来的方法中只是让我们很容易找到最后一个节点,所以你不必遍历列表来找到它

    示例

    【讨论】:

    • 但是它是怎么遍历到最后的呢?我的意思是我们如何确定它已经结束了?
    • 因为current 结束了。
    【解决方案2】:

    current是下一个AddAtLast操作的候选位置,即链表的结束节点。

    我理解为什么出现 count++ 可能是因为它想跟踪 > 添加新元素的位置,但如果我的理解 > 对此有误,请纠正我。

    对于您在此处显示的链表结构,count 用于跟踪节点数,current 用于跟踪当前要添加的最后位置(即是添加newNode之前链表中的最后一个旧节点),方便AddAtLast操作。通过AddAtLast方法在旧的current添加newNode后,您的current将被移动并引用更新的最后一个节点(即刚刚添加的newNode)。

    【讨论】:

      【解决方案3】:

      看起来您正在尝试跟踪当前元素,就好像您在 C 中使用指针作为尾部一样。 因此,您可以对最终对象引用进行引用。这本质上是 Type Node 的一个属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-29
        • 1970-01-01
        • 2019-01-08
        • 2019-09-14
        • 2015-06-15
        • 1970-01-01
        • 2011-10-13
        • 1970-01-01
        相关资源
        最近更新 更多