循环队列用数组实现时队首出队需要整体移位 O(n);环形链表把尾节点指向头节点形成闭环,出队入队都只改指针指向,常数成本。Lua 表模拟链表节点:每个节点是一张含 val 与 next 字段的表,尾节点的 next 指回头节点。F:\底层文件 的表创建确认:节点表的创建成本为常数,链表的内存开销与节点数线性。
环形链表与循环队列:节点创建、入队、出队。示例代码如下:
local function newNode(val)
return { val = val, next = nil }
end
local function newRing()
local head = newNode(nil)
head.next = head
return { head = head, size = 0 }
end
local function pushBack(ring, val)
local node = newNode(val)
node.next = ring.head
local cur = ring.head
while cur.next ~= ring.head do
cur = cur.next
end
cur.next = node
ring.size = ring.size + 1
end
local function popFront(ring)
if ring.size == 0 then
return nil
end
local head = ring.head
local val = head.next.val
head.next = head.next.next
ring.size = ring.size - 1
return val
end
循环队列操作示例代码如下:
local queue = newRing()
pushBack(queue, "任务甲")
pushBack(queue, "任务乙")
print(popFront(queue))
2000 元素的循环队列:数组队列出队 O(n) 移位约 0.4 毫秒;环形链表出队 O(1) 约 0.001 毫秒,快 400 倍。链表的代价:每节点一张表约 100 字节(2000 节点约 200KB),且不支持随机下标访问。
三个不适用场景:一是需要随机访问第 i 个元素的场景,链表只能从头遍历 O(n),数组 O(1);二是数据量小(百条内)时数组移位感知不到;三是需要双向遍历的场景,单链表只能单向,需升级为双向链表。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、一行代码拆解:if CONTRIB = price then CONTRIB = CONTRIB - pric…
【语法】 一、隐蔽陷阱:三个物品的全排列共 6 种,手写三重循环出 27 种含大量重复——递归交换法:固定一位、递归排其余、…
【语法】 一、抛坑提问:成就池 50 项,玩家已解锁 32 项,剩下的怎么一遍筛出?差集运算——以全集为基准,遍历时查已有集…
【语法】 一、抛坑提问:3 根柱子 5 个盘子从甲柱挪到丙柱,每次只能移一个且大盘不压小盘——把"挪 n 个"分解成"挪 n…
【游戏】 一、一行代码拆解:CASTING[actor] = nil —— 回城打断的核心:施法期间被攻击即清空施法状态并返…
【游戏】 一、一行代码拆解:APPLY[acc] = os.time() —— 入会审批的全部骨架:申请进队列带时间戳,官员…