我有一个像这样定义的链表:
list = nil
list = {next=nil, value=value}
所以我试图找到列表的尾部并向其追加一个元素:
function appendToBack(list, value)
local list = list
if not list then
list = {next=nil, value=value}
else
local next = list.next
while true do
if not next then
next = {next=nil, value=value}
break
else
next = next.next
end
end
end
return list
end
如何使用类似函数找到自定义链接列表的最后一个/任何节点?
答案 0 :(得分:2)
要查找列表中的最后一个节点,您可以执行以下操作:
function last (list)
-- Just checking...
if list == nil then
return nil
end
-- We start at the first node...
local node = list
-- ...while there's a next...
while node.next ~= nil do
-- ... we move to it
node = node.next
end
-- when we reach this line, node variable holds the
-- last element in the list
return node
end
它类似于你的函数,但这里的迭代永远不会通过列表的末尾(即node
变量永远不会nil
)。如果需要,您可以编写last
函数的递归版本;它会更简单: - )
现在您的last
功能已在appendToBack
中,其他分支可以读取:
last (list).next = { value = value }
答案 1 :(得分:1)
该列表将具有以下结构:
list = { -- [1]
value = 'list head',
next = { -- [2]
value = 'list node',
next = { -- [3]
value = 'list tail',
},
},
}
列表的尾部是next
为nil
的第一个节点(即上面的节点3)。通过循环并在具有有效的下一节点时更新对尾部的引用来查找列表尾部。 tail.next
为nil
后,tail
的值就是列表的结尾。
local tail = list
while tail.next do
tail = tail.next
end
tail.next = { value=value }