【问题标题】:How does this Linked List example in Lua actually work?Lua 中的这个链接列表示例实际上是如何工作的?
【发布时间】:2019-05-31 08:19:08
【问题描述】:

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

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

如果我没看错

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

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

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

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

或者我离这里很远?

【问题讨论】:

    标签: lua linked-list


    【解决方案1】:

    这有点类似于其他语言中的 LIFO 链表(如 )。是的,你没看错。

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

    • 21
    • 你好
    • 35
    • 没有

    然后,我的list 被创建为:

    list = {
        value = "No",
        next = {
            value = 35,
            next = {
                value = "Hi",
                next = {
                    value = 21
                    next = nil
                }
            }
        }
    }
    

    【讨论】:

    • 非常感谢。我真的对“下一个”发生的分配感到困惑,因为它看起来好像只是被设置为自己,但显然理解代码执行时分配发生的顺序是理解如何这行得通。我曾预料到某种“中间人”节点,例如“current”,类似于我学习 C++ 数据结构时所做的。谢谢你帮我敲掉一点锈!
    【解决方案2】:

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

    我给你举个例子。

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

    执行此操作时,第一个 next 键将为 nil,因为尚未定义 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
            }
        }
    }
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2012-06-07
      • 1970-01-01
      相关资源
      最近更新 更多