在 Lua 中使用函数修改链表

我的问题是关于下面的代码片段:

function add_node(list, v)
 list={next=list, val=v}
end

function print_linked_list(list)
 local l=list
 while l do
  print(l.val)
  l=l.next
 end
end

root=nil
root={next=root, val=0}
add_node(root,1)
--root={next=root, val=2}
print_linked_list(root)

如果我通过当前被注释掉的“root={nxt=root, val=1}”进行操作,它会像预期的那样工作。print函数将遍历列表并打印两个值。如果我通过位于脚本顶部的add_node函数添加一个新节点,该函数本质上具有相同的代码,则它只会打印第一个创建的节点。

为什么将操作放在函数中不能正确地修改列表?唯一能想到的是在add_node(list, v)中创建的节点是本地节点。

最后,如何在保持代码可读性的同时解决这个问题?

点赞
用户3574628
用户3574628

唯一我能想到的是,在add_node(list, v)中创建的节点仅为局部。

是的。函数参数隐式为局部。你需要做的就是返回该值而不是分配它:

function add_node(list, v)
  return {next=list, val=v}
end

然后:

root = add_node(root, 1)
2018-02-15 22:43:05