Lua中的链接列表

use*_*398 4 lua linked-list lua-table

我最近一直在查找Lua中的链接列表并有一个快速的问题,到目前为止我还没有找到答案

local head = nil

head = {next = head, value = "d"}
head = {next = head, value = "c"}
head = {next = head, value = "b"}
head = {next = head, value = "a"}

local entry = head

while entry do
  print(entry.value)

  entry = entry.next
end
Run Code Online (Sandbox Code Playgroud)

这将最终打印出"a,b,c,d".我理解为什么它会向后打印,因为可用的第一个"节点"将是最终创建的(节点值= a).我的问题是为什么在最后一个之前创建的头部仍然存在并且没有被简单地覆盖在内存中.

Nic*_*las 6

你在"记忆中被覆盖"是什么意思?你所做的一切都不会导致这种情况发生.

让我们一步一步看看你在做什么.

local head = nil
Run Code Online (Sandbox Code Playgroud)

现在存在一个名为的局部变量head.它有价值nil.

head = {next = head, value = "d"}
Run Code Online (Sandbox Code Playgroud)

让我们把它分解为这里的操作顺序.这相当于以下内容:

do
  local temp = {}
  temp.next = head  --This is still `nil`
  temp.value = "d"
  head = temp
end
Run Code Online (Sandbox Code Playgroud)

您构建的每个表都是唯一值.让我们称之为第一张表table-d.它被构造,存储在临时变量中temp.该表的next值为nil.并且它获得了value价值"d".结果存储在局部变量中head.

所以现在head有价值table-d.下一步:

head = {next = head, value = "c"}
Run Code Online (Sandbox Code Playgroud)

一样:

do
  local temp = {}
  temp.next = head  --Not nil anymore.
  temp.value = "c"
  head = temp
end
Run Code Online (Sandbox Code Playgroud)

好的,我们创建一个新表.为清楚起见,我们将此表称为table-c.

我们存储了这个temp.然后我们将它的next字段设置为值head.那个价值是table-d.我们将value字段设置为"c".然后table-c存入head.

table-c表如下所示:

{
  next = { value = "d" }
  value = "c"
}
Run Code Online (Sandbox Code Playgroud)

那是存储在中的表head.

这继续这样.那么哪些东西会被"覆盖"?