(Lua)如何找到自定义链表的尾部?

时间:2015-04-14 15:18:31

标签: lua

我有一个像这样定义的链表:

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

如何使用类似函数找到自定义链接列表的最后一个/任何节点?

2 个答案:

答案 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',
    },
  },
}

列表的尾部是nextnil的第一个节点(即上面的节点3)。通过循环并在具有有效的下一节点时更新对尾部的引用来查找列表尾部。 tail.nextnil后,tail的值就是列表的结尾。

local tail = list
while tail.next do
  tail = tail.next
end
tail.next = { value=value }