这个用Lua实现的链表示例如何工作?

我正在重新学习编程,经过多年,目前专注于C#和Lua。我在Lua的书中看到了一个关于链接列表的例子,但是我很难理解它到底是如何工作的。

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

如果我理解得对的话

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

然后在下一次循环运行时

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

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

或者我完全错了?

点赞
用户1190388
用户1190388

这与其他语言(如cc++)中的LIFO链表有些相似。是的,你理解得没错。

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

  • 21
  • Hi
  • 35
  • No

那么,我的list将被创建为:

list = {
    value = "No",
    next = {
        value = 35,
        next = {
            value = "Hi",
            next = {
                value = 21
                next = nil
            }
        }
    }
}
2013-03-29 18:19:22
用户7022315
用户7022315

基本上发生了什么是,在一个循环内,你正在创建一个新的表,并且next键一开始是空的。在随后的循环中,你又再次创建一个表,然后将list变量赋值给next键,它现在是对前一个表的引用,等等。

我给你个例子。

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

当这个执行时,第一个next键将是空的,因为list还没有被定义。但在下一个表中,它的next键将是对前一个表的引用,等等。如果你尝试打印list.intlist.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-01 05:44:25