Lua 链表的增删改查

Linked = { data = 0, next = nil}--创建一个表(data:数据  next:指针(在链表中用作指向下一个节点))

function Linked : Creat()--创建一个链表
   
   local newtable= {}--创建一个表
    setmetatable(newtable, {__index=self})--设置元表
    return newtable
end

根据上图可以看出一个链表是由一节一节的节点拼接在一起的一串数据,然而将这些节点拼接在一起的依据就是每个节点的指针(即next),所以说在链表里指针指向谁你的下一个数据

就是如果想要增加一个数据在这个链表里,只需要将你要存的位置的指针指向你当前的节点然后将你当前新建节点的指针指向原本链表里你想要插入位置的下一个节点即可

function Linked : InsertionTail(data)--往链表尾部插入数据
    
    local newnode = {}
    setmetatable(newnode, Linked)
    newnode.data = data
    newnode.next = nil
    local l_inputkey = self--将头节点的数据赋值给l_inputkey
    while l_inputkey.next do--遍历链表判断链表下一个数据是不是空
        l_inputkey = l_inputkey.next--不是空就将前一个数据等于后一个数据
    end
	--循环结束后就代表已经将所有的数据遍历结束当前的l_inputkey.next是没有数据的
    l_inputkey.next = newnode--将最后一个设为新的对象
	--将更新后的链表返回
    return self

end

 --尾部插入:在尾部插入时第一步也是要先创建一个新的的节点,将你的数据放入新的节点,然后利用self记录头节点,循环整个链表到最后一个,将记录下来的最后一个节点的指针指向新的节点

function Linked : InsertionHead(data)	--往链头尾部插入数据
   
    local newnode = {}	--创建一个新表
    setmetatable(newnode, Linked)	--设置元表
    newnode.data = data	--数据就等于传过来的数
    newnode.next = self.next
    self.next = newnode	--把新的头节点赋值给self
    return self
end

--头部插入:在链表的最开始也就是头部插入一个节点,只需要创建一个新的节点将你要放入的数据放到节点然后将你新创建节点的指针指向原本的头节点(self在每个函数里都有一个self,self就是用来记录每一次的头节点的) 

function Linked : RemoveNode (data)	--删除一个节点
    
    local remnode = self.next	--将头节点的下一个节点赋值给eranode
	
    local head = self
    while remnode do	--判断当前的节点是否为空
        if remnode.data == data then	--判断数据是否相等
			--删除一个节点
            remnode = remnode.next	--让当前的节点等于下一个节点
            head.next = remnode	--将记录的上一个节点的指针设为删除节点的下一个节点
			break
        end
        head = remnode	--一直记录上一个数据
        remnode = remnode.next	--eranode等于下一个节点
    end

end

--删除节点:第一步先找到头节点,遍历链表找到要删除的节点,将这个节点等于它的下一个节点(直接让后面一个节点将他覆盖),然后在将这个要删除节点的上一个节点指向这个覆盖的节点 

function Linked : display()--遍历

    printnode = self.next	--记录头节点的下一个节点
    while printnode do	--从头节点的下一个节点开始
       print(printnode.data)	--输出信息
       printnode = printnode.next	--让节点等于下一个节点(作用相当于C#里的++,当printnode的数据为空时就会停止遍历)
    end
    print("= = display OK = =")

end

将数据插入链表中间 

function Linked:InsertionCenterUp(data,data1)	--在一个数据前面插入一个数据
	local head=self.next	--记录头节点的下一个节点
	local newdata={}	--创建一个新节点
	setmetatable(newdata,Linked)
	newdata.data=data1	--数据赋值
	newdata.next=nil	--新节点的指针设为空
	local jilu	--创建一个新的节点用来存储节点
	while head do
		if head.data==data then	--判断数据是否相等
			jilu.next=newdata	--将记录的上一个节点的指针指向新的节点
			newdata.next=head	--将新节点的指针指向当前节点
			break
		end
		jilu=head	--让jilu这个节点一直存储上一个节点
		head=head.next	--让节点等于下一个节点
	end
end
function Linked:InsertionCenterBack(data,data1)--在一个数据后面插入一个数据
	local head=self.next	--记录头节点的下一个节点
	local newdata={}	--创建一个新节点
	setmetatable(newdata,Linked)
	newdata.data=data1	--数据赋值
	newdata.next=nil	--新节点的指针设为空
	local jilu	--创建一个新的节点用来存储节点
	while head do	--当节点为空时结束
		if head.data==data then	--判断数据是否相等
			jilu=head.next	--记录的节点就等于当前节点的下一个节点
			head.next=newdata	--将找到节点的指针指向新创建节点
			if jilu.next==nil then	--判断当前节点的下一个节点的指针是否为空(相当于判断该节点是不是最后一个节点)
				newdata.next=nil	--如果是最后一个节点就将新节点设为最后一个节点(指针为空即可)
			else
				newdata.next=jilu	--如果不是最后一个节点就将指针指向记录节点的下一个节点
			end
			break
		end
		head=head.next	--让节点等于下一个节点
	end
end

猜你喜欢

转载自blog.csdn.net/qq_66312646/article/details/123290162