--list
--node={prev=nil,next=nil,value=nil}
--DoubleList={header=node,tail=node}
--生成一个table
local function buildInitNode(value)
node = {value=value}
node.prev=node
node.next=node
return node
end
function remove(baseNode)
baseNode.next.prev=baseNode.prev
baseNode.prev.next=baseNoe.next
baseNode.prev=nil
baseNode.next=nil
end
function pop_back(dl)
if dl.header.next==dl.tail then
return nil
end
local obj =dl.tail.prev
remove(obj)
return obj
end
function pop_front(dl)
if dl.header.next == dl.tail then
return nil
end
local obj=dl.header.next
remove(obj)
return obj
end
function insert(baseNode,value)
local obj=buildInitNode(value)
obj.next=baseNode.next
obj.prev=baseNode
baseNode.next.prev=obj
baseNode.next=obj
end
function find(dl,value)
local header=dl.header
while header.next ~=dl.tail do
if header.next.value == value then
return header.next
end
header=header.next
end
return nil
end
local function init(dl)
--当or的前面是false或nil就会返回后面的值
dl=dl or {}
sentry=buildInitNode()
dl.header=sentry
dl.tail=sentry
return dl
end
--dl 链表
function push_back(dl,value)
local obj=buildInitNode()
local tail=dl.tail
obj.value=value
obj.next=tail
obj.prev=tail.prev
tail.prev.next=obj
tail.prev=obj
end
function push_front(dl,value)
local obj=buildInitNode()
local header=dl.header
obj.value=value
obj.next=header.next
obj.prev=header
header.next=obj
header.next.prev=obj
end
function iterDoubleList(dl)
local iter=function(node,val)
if node.curr==dl.tail then
return nil
end
-- node.curr =={next,prev,value}
local nv=node.curr.value
node.curr=node.curr.next
return nv
end
local node={curr=dl.header.next }
return iter,node
end
--函数封装到table的成员变量
list={
init=init,
push_back=push_back,
push_front=push_front,
find=find,
pop_back=pop_back,
pop_front=pop_front,
foreach_node=foreach_node,
iter=iterDoubleList
}
用法
dl=list.init()
list.push_back(dl.6)