local function iter(lst, elem) if not elem then elem = lst.first else elem = elem.next end return elem end local list_mt = {} list_mt.__index = list_mt list_mt.push_back = function(self, val) if self.last == nil then self.first = {value = val, prev = nil, next = nil} self.last = self.first else self.last.next = {value = val, prev = self.last, next = nil} self.last = self.last.next end end list_mt.remove = function(self, elem) if elem.next then elem.next.prev = elem.prev end if elem.prev then elem.prev.next = elem.next end if self.last == elem then self.last = elem.prev end if self.first == elem then self.first = elem.next end elem = nil end -- Iterator for List function ilist(lst) return iter, lst, nil end -- Create new List function NewList() local self = { first = nil, last = nil } setmetatable(self, list_mt) return self end lst = NewList() lst:push_back(123) lst:push_back(456) lst:push_back(789) lst:push_back(456) lst:push_back(789) local cnt = 0 for elem in ilist(lst) do if elem.value == 456 then lst:remove(elem) end cnt = cnt + 1 print(cnt, elem.value) end print("-----") cnt = 0 for elem in ilist(lst) do cnt = cnt + 1 print(cnt, elem.value) end