循环队列用数组实现时队首出队需要整体移位 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 dist 20 then rate = 0.5 end —— 距离折损的全部骨架。组队打宝有人…
【游戏】 一、业务场景:STOCK = STOCK - 1 —— 全服限量抢购的核心一行。限量 1000 件的活动因不验余量…
【语法】 一、抛坑提问:按"金币除以等级"的复合值排序,比较函数里每次都现算除法,n log n 次重复计算——装饰排序先把…
【语法】 一、抛坑提问:背包格子列表整体后移 2 格,末尾 2 件绕回头部,逐个搬移要写嵌套循环——三步反转法三次交换完成,…
【游戏】 一、业务场景:PROGRESS = 0 —— 任务重接的全部规则。讨伐祖玛教主 30 只的任务卡在 29 只想换路…
【语法】 一、隐蔽陷阱:嵌套盒子求总金币用递归,盒子层数不可控时调用栈随之失控;把递归改成显式栈循环,层数与内存占用从失控变…