Lua - 实现单链表及链表操作

Lua实现单链表时,需要注意的是  保持存放头节点地址的变量不变,如需遍历,则赋值其他变量进行操作。始终对链表名变量(存放头节点地址的变量,即:链表名.next = headNode)进行安全访问。

-- 操作链表的方法table
local Linklist = {}

-- 初始化,构建一个空表
function Linklist.init()
    -- body
    local node = {}
    -- list为链表名变量
    local list = node
    list.length = 0
    list.next = nil
    print("链表初始化成功")
    -- 返回链表初始节点和当前节点
    return list, node
end

function Linklist.checkList(list)
    -- body
    if not list then print("链表不存在") return end
end

function Linklist.checkIndex(list, index)
    -- body
    if index < 1 or index > list.length + 1 then
        print("索引越界")
        return
    end
end

function Linklist.checkAll(list, index)
    -- body
    Linklist.checkList(list)
    Linklist.checkIndex(list, index)
end

-- 尾部添加节点
function Linklist.addTail(list, node, data)
    -- body
    Linklist.checkList(list)

    -- 创建新的尾部节点
    node.next = {} 
    node = node.next
    node.next = nil
    node.data = data
    list.length = list.length+1
    
    print("尾部添加节点成功")
    return node
end

-- 头部添加节点
function Linklist.addHead(list, data)
    -- body
    Linklist.checkList(list)

    --修改新节点和头节点的next
    local newNode = {}  
    newNode.data = data
    newNode.next = list.next
    list.next = newNode
    list.length = list.length+1
    print("头部添加节点成功")
end

-- 索引添加节点
function Linklist.insertByIndex(list, index, data)
    -- body
    Linklist.checkAll(list, index)

    local j,k,l = index - 1, 0, list
    while k ~= j do
        k = k + 1
        l = l.next
    end

    -- 开始添加
    local newNode = {}
    newNode.data = data
    newNode.next = l.next
    l.next = newNode
    list.length = list.length + 1
    print("索引添加节点成功")

end

-- 索引删除并返回节点数据内容
function Linklist.deleteByIndex(list, index)
    -- body
    Linklist.checkAll(list, index)

    local j,k,l = index - 1, 0, list
    while k ~= j do
        k = k + 1
        l = l.next
    end

    -- 开始删除 l.next
    d = l.next.data
    t = l.next.next
    l.next = nil
    l.next = t
    list.length = list.length - 1
    print("索引删除节点成功")
    
end

-- 索引修改节点内容
function Linklist.modifyDataByIndex(list, index, data)
    -- body
    Linklist.checkAll(list, index)

    local l = list.next
    local k = 1
    while l do
        if k == index then
            l.data = data
            print("索引修改节点成功")
            return
        end
        l = l.next
        k = k + 1
    end
    print("索引越界")
end

-- 索引获取指定节点内容
function Linklist.getDataByIndex(list, index)
    -- body
    Linklist.checkAll(list, index)

    local l = list.next
    local k = 1
    while l do
        if k == index then
            print("索引获取节点成功")
            return l.data
        end
        l = l.next
        k = k + 1
    end
    print("索引越界")
end

-- 反转倒置链表
function Linklist.reverse(list)
    -- body
    Linklist.checkList(list)

    -- p为当前遍历的节点 q为前遍历节点的前一节点 pr中间变量
    -- ret 返回反转后的链表
    local p, q= list.next, nil
    list.next = nil
    while p do
        pr = p.next
        p.next = q
        q = p
        p = pr
    end
    list.next = q
    print("链表反转倒置成功")
    return list
end

-- 打印链表元素
function Linklist.display(list)
    -- body
    Linklist.checkList(list)

    local l = list.next
    local x = 1
    while l do
        print(x .. "  " .. l.data)
        l = l.next
        x = x + 1
    end
    print('-- display ok --')
end

-- 链表是否为空
function Linklist.isEmpty(list)
    -- body
    Linklist.checkList(list)

    return list.length == 0
end

-- 清理链表,操作完成后,链表还在,只不过为空,相当刚开始的初始化状态
function Linklist.clear(list)
    -- body
    Linklist.checkList(list)

    while true do
        -- fNode为遍历用指针
        fNode = list.next
        -- 满足则已为空表
        if not fNode then  
            print("链表清理成功")
            break
        end
        t = fNode.next
        -- 置空
        list.next = nil
        list.next = t
    end
    list.length = 0
end

-- 销毁链表
function Linklist.destory(list)
    -- body
    if list then
        Linklist.clear(list)
    end
    list = nil
    print("链表销毁成功")
end

Linklist.addByIndex = Linklist.insertByIndex
Linklist.removeByIndex = Linklist.deleteByIndex
Linklist.changeDataByIndex = Linklist.modifyDataByIndex

local dList, curNode = Linklist.init()
print(Linklist.isEmpty(dList))
curNode = Linklist.addTail(dList, curNode, 6)
curNode = Linklist.addTail(dList, curNode, 7)
Linklist.addHead(dList, 7)
Linklist.insertByIndex(dList, 1, 1)
Linklist.insertByIndex(dList, 3, 3)
Linklist.addByIndex(dList, 6, 9)
Linklist.deleteByIndex(dList, 3)
Linklist.removeByIndex(dList, 4)
Linklist.modifyDataByIndex(dList, 4, 20)
Linklist.changeDataByIndex(dList, 3, 16)
Linklist.changeDataByIndex(dList, 1, 3)
print(Linklist.isEmpty(dList))
print(Linklist.getDataByIndex(dList, 3))
Linklist.display(dList)
Linklist.reverse(dList)
Linklist.display(dList)
Linklist.clear(dList)
print(Linklist.isEmpty(dList))
Linklist.destory(list)

print("=====================我是分界线==============================")

运行结果如下:

链表初始化成功
true
尾部添加节点成功
尾部添加节点成功
头部添加节点成功
索引添加节点成功
索引添加节点成功
索引添加节点成功
索引删除节点成功
索引删除节点成功
索引修改节点成功
索引修改节点成功
索引修改节点成功
false
索引获取节点成功
16
1  3
2  7
3  16
4  20
-- display ok --
链表反转倒置成功
1  20
2  16
3  7
4  3
-- display ok --
链表清理成功
true
链表销毁成功
=====================我是分界线==============================

 

你可能感兴趣的:(lua,链表)