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
CmxvY2FsIGZ1bmN0aW9uIGl0ZXIobHN0LCBlbGVtKQogICAgaWYgbm90IGVsZW0gdGhlbiBlbGVtID0gbHN0LmZpcnN0CiAgICBlbHNlIGVsZW0gPSBlbGVtLm5leHQgZW5kCiAgICByZXR1cm4gZWxlbQplbmQKCmxvY2FsIGxpc3RfbXQgPSB7fQpsaXN0X210Ll9faW5kZXggPSBsaXN0X210Cmxpc3RfbXQucHVzaF9iYWNrID0gZnVuY3Rpb24oc2VsZiwgdmFsKSAKICAgIGlmIHNlbGYubGFzdCA9PSBuaWwgdGhlbgogICAgICAgIHNlbGYuZmlyc3QgPSB7dmFsdWUgPSB2YWwsIHByZXYgPSBuaWwsIG5leHQgPSBuaWx9CiAgICAgICAgc2VsZi5sYXN0ID0gc2VsZi5maXJzdAogICAgZWxzZQogICAgICAgIHNlbGYubGFzdC5uZXh0ID0ge3ZhbHVlID0gdmFsLCBwcmV2ID0gc2VsZi5sYXN0LCBuZXh0ID0gbmlsfQogICAgICAgIHNlbGYubGFzdCA9IHNlbGYubGFzdC5uZXh0CiAgICBlbmQKZW5kCgpsaXN0X210LnJlbW92ZSA9IGZ1bmN0aW9uKHNlbGYsIGVsZW0pICAgICAKICAgIGlmIGVsZW0ubmV4dCB0aGVuIGVsZW0ubmV4dC5wcmV2ID0gZWxlbS5wcmV2IGVuZAogICAgaWYgZWxlbS5wcmV2IHRoZW4gZWxlbS5wcmV2Lm5leHQgPSBlbGVtLm5leHQgZW5kCiAgICBpZiBzZWxmLmxhc3QgPT0gZWxlbSB0aGVuIHNlbGYubGFzdCA9IGVsZW0ucHJldiBlbmQKICAgIGlmIHNlbGYuZmlyc3QgPT0gZWxlbSB0aGVuIHNlbGYuZmlyc3QgPSBlbGVtLm5leHQgZW5kCiAgICBlbGVtID0gbmlsCmVuZAoKLS0gSXRlcmF0b3IgZm9yIExpc3QKZnVuY3Rpb24gaWxpc3QobHN0KQogICAgcmV0dXJuIGl0ZXIsIGxzdCwgbmlsCmVuZAoKLS0gQ3JlYXRlIG5ldyBMaXN0CmZ1bmN0aW9uIE5ld0xpc3QoKQogICAgbG9jYWwgc2VsZiA9IHsKICAgICAgICBmaXJzdCA9IG5pbCwKICAgICAgICBsYXN0ID0gbmlsCiAgICB9CiAgICBzZXRtZXRhdGFibGUoc2VsZiwgbGlzdF9tdCkKICAgIHJldHVybiBzZWxmCmVuZAoKbHN0ID0gTmV3TGlzdCgpCmxzdDpwdXNoX2JhY2soMTIzKQpsc3Q6cHVzaF9iYWNrKDQ1NikKbHN0OnB1c2hfYmFjayg3ODkpICAgIApsc3Q6cHVzaF9iYWNrKDQ1NikKbHN0OnB1c2hfYmFjayg3ODkpCgpsb2NhbCBjbnQgPSAwCmZvciBlbGVtIGluIGlsaXN0KGxzdCkgZG8KICAgIGlmIGVsZW0udmFsdWUgPT0gNDU2IHRoZW4KICAgICAgICBsc3Q6cmVtb3ZlKGVsZW0pCiAgICBlbmQKICAgIGNudCA9IGNudCArIDEKICAgIHByaW50KGNudCwgZWxlbS52YWx1ZSkgICAgICAgIAplbmQKCnByaW50KCItLS0tLSIpCgpjbnQgPSAwCmZvciBlbGVtIGluIGlsaXN0KGxzdCkgZG8KICAgIGNudCA9IGNudCArIDEKICAgIHByaW50KGNudCwgZWxlbS52YWx1ZSkgICAgICAgICAgICAgICAgCmVuZA==