require("class")
List = class()
local function InitNote(data, prev, next)
local o = {}
o.Data = data
o.Prev = prev
o.Next = next
return o
end
function List:ctor()
self.Head = InitNote(nil)
self.Head.Prev = self.Head
self.Head.Next = self.Head
self.Size = 0
end
function List:AddLast(data)
if self.Size == 0 then
self.Head = InitNote(data, nil, nil)
self.Head.Prev = self.Head
self.Head.Next = self.Head
self.Size = self.Size + 1
return
else
local p = self:GetElement(self.Size)
local q = InitNote(data, p, p.Next)
self.Head.Prev = q
p.Next = q
self.Size = self.Size + 1
end
end
function List:GetElement(index) -- 1 -- size
if (index <= 0 or index > self.Size) then
print("LinkList is empty or Position is error!")
return nil;
end
if (index == 1) then
return self.Head
end
if (index < self.Size / 2) then
local item = self.Head
for i = 1, index do
item = item.Next
end
return item
end
local p = self.Head;
local rindex = self.Size - index + 1
for i = 1, rindex do
p = p.Prev
end
return p
end
function List:Insert(index, data) --����indexǰ
if (self.Size <= 0 or index >= self.Size or index <= 0) then
print("LinkList is empty or Position is error!")
return
end
if (index == 1) then
local note = InitNote(data, self.Head.Prev, self.Head)
self.Head.Prev.Next = note
self.Head.Prev = note
self.Head = note
self.Size = self.Size + 1
else
local inode = self:GetElement(index)
local tnode = InitNote(data, inode.Prev, inode)
inode.Prev.Next = tnode
inode.Prev = tnode
self.Size = self.Size + 1
end
end
function List:Append(index, data) --����index��
if (self.Size <= 0 or index > self.Size or index <= 0) then
print("LinkList is empty or Position is error!")
return
end
local inode = self:GetElement(index)
local tnode = InitNote(data, inode, inode.Next)
inode.Next.Prev = tnode
inode.Next = tnode
self.Size = self.Size + 1
end
function List:Del(index) -- 1 -- size
if (self.Size <= 0 or index > self.Size or index <= 0) then
print("LinkList is empty or Position is error!")
return
end
if (index == 1) then
self.Head.Prev.Next = self.Head.Next
self.Head.Next.Prev = self.Head.Prev
self.Head = self.Head.Next
self.Size = self.Size - 1
return
end
local inode = self:GetElement(index)
if (inode == nil) then return end
inode.Prev.Next = inode.Next;
inode.Next.Prev = inode.Prev;
self.Size = self.Size - 1
end
function List:IsEmpty()
return self.Size == 0
end
function List:ShowAll()
if self:IsEmpty() then
print("LinkList is empty!")
end
local note = self.Head
for i = 1, self.Size do
print(note.Data)
note = note.Next
end
end