4

几年后我正在重新学习编程,我目前专注于 C# 和 Lua。我用于 Lua 的书有一个链接列表的例子,但我很难理解它是如何工作的。

list = nil
for line in io.lines() do
   list = {next = list, value = line}
end

如果我没看错

  • 它正在创建一个新表
  • 将列表分配给该表,将“下一个”键/标识符(正确的术语?)设置为指向列表(在第一个创建的表处仍为 nil)
  • 然后将“值”键/标识符设置为读入的任何内容
  • 那么“列表”现在实际上指向新创建的表

然后在循环的下一次运行中

  • 创建下一个表
  • 将“下一个”键/标识符设置为指向列表(现在指向先前创建的表)
  • 然后将“值”键/标识符设置为读入的任何内容
  • 那么“列表”现在实际上指向新创建的表......再次

我只是想确定我完全理解它是如何工作的,因为列表正在尝试创建一个表并指向它当前指向的任何内容,就在该行的执行完成和列表之前,这似乎有点奇怪/奇怪已更新为指向最新创建的表。

还是我离这儿很远?

4

2 回答 2

4

)中的 LIFO 链表。是的,您正确地遵循了它。

假设我的输入是:(以相同的顺序)

  • 21
  • 你好
  • 35

然后,我list的创建为:

list = {
    value = "No",
    next = {
        value = 35,
        next = {
            value = "Hi",
            next = {
                value = 21
                next = nil
            }
        }
    }
}
于 2013-03-29T18:19:22.300 回答
0

本质上发生的事情是,在 for 循环中,您正在创建一个表,并且next键最初是 nil。在随后的循环中,您将再次创建一个表并使用list变量将其分配给next键,该键现在是对前一个表的引用,依此类推。

我给你举个例子。

for i=1,3 do
    list = {int=i, next=list}
end

执行此操作时,第一个next键将为零,因为list尚未定义。但在下一个表中,它的next键将是对上一个表的引用,依此类推。如果您尝试打印list.intand list.next,它们将引用 int=3 的表,因为 for 循环在 3 处结束,因此变量引用该部分。如果您需要更改此设置,只需将数字 for 循环更改为类似

for i=3,1,-1 do

所以它实际上看起来像这样:

list = {int=1, next=nil}
list = {int=2, next=previousTable}
list = {int=3, next=previousTable}

或者

list = {
    int=3, 
    next = {
        int=2, 
        next = {
            int=1, 
            next=nil
        }
    }
}

希望这可以帮助。

于 2019-05-01T05:44:25.320 回答