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

mis*_*hsx 7 c# linked-list data-structures

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

public void AddAtLast(object data)
{
   Node newNode = new Node();
   newNode.Value = data;
   current.Next = newNode;
   current = newNode;
   Count++;
}
Run Code Online (Sandbox Code Playgroud)

我明白了什么部分

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

我需要帮助的是什么

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

另外,我们为什么这样做current=newNode

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

AAA*_*ddd 9

因此,让我们看看AddAtLast(object data)链接列表类的方法中逐行发生的事情

  1. Node newNode = new Node();

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

  1. newNode.Value = data;

将一些数据分配给节点

  1. current.Next = newNode;

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

  1. current = newNode;

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

  1. Count++

递增CountLinked List,其漂亮知道一个列表的大小,而不必遍历所有元素.这只是一个总是知道计数的简单方法.


你要记住的第一件事

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

  1. 保留内存的物理部分并用新对象填充它
  2. 为该内存创建一个引用(又名Address,aka Pointer).把地址想象成一个在家里某处的东西的便利贴.

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

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


要记住的第二件事

投资到关联列表Clever-Clogs知道我们必须以某种方式跟踪项目,因此他们设想在添加节点时,某些其他节点需要链接到它.

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


另一种思考方式

可以把它想象Current成一个桶,在那个桶中你有一个Node,在那个Node上是一张叫做next的纸.

  1. 有人递给你一个新节点.
  2. 你好好地在你当前拥有的节点上写下这个新节点的名字(有人给我们)(Next/Link每个节点都有Post-It-Note)
  3. 你把水桶放在地板上,然后把你的新节点放在水桶里.

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

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

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

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

在此输入图像描述

  • 因为`current`**是**结束. (3认同)