双向链表如何撑起浏览器的前进后退

你每次点"后退""前进",背后是一张双向链表在默默记录历史。今天用浏览器历史这个人人都用过的例子,讲清双向链表"正反都能走、且能 O(1) 自删"的独特价值。
打开浏览器,访问 A→B→C,再点"后退"回到 B,接着访问 D——这时"前进"到 C 的按钮消失了。这套看似理所当然的行为,底层正是双向链表。
为什么是双向链表?历史记录本质上是一个序列,你需要能向前走(前进)也能向后走(后退),而单链表只能单向。双向链表每个节点带 prev 和 next,天然支持两个方向遍历。
"访问新页面就截断前进历史"怎么实现?当在 B 处点开新页面 D 时,系统把 B 之后的整段(C 及其后续)从链表中摘除。双向链表的优势在此显现:只要拿到当前节点 B,就能 O(1) 把它后面的节点整段断开,而不必先遍历找前驱。单链表做不到这一点(删后面容易,但"丢弃后面整段"仍需处理指针)。
再抽象一层:任何"需要双向导航 + 频繁在当前位置增删后续"的场景——文本编辑器的光标历史、音乐播放器的播放队列、撤销重做栈——都能用双向链表干净地建模。它比单链表多一个指针的代价,在这些场景里完全值回票价。
图:浏览器前进/后退背后的双向链表
参考代码(Python)
浏览器前进/后退就是双向链表:访问新页面即截断其后整段。
class Node:
def __init__(self, url):
self.url=url; self.prev=None; self.next=None
class History:
def __init__(self):
self.cur=Node("首页")
def visit(self, url):
# 在当前页后插入,并截断其后整段(前进历史消失)
self.cur.next=Node(url)
self.cur.next.prev=self.cur
self.cur=self.cur.next
def back(self):
if self.cur.prev: self.cur=self.cur.prev
def forward(self):
if self.cur.next: self.cur=self.cur.next
关联推荐
- 插入、选择、冒泡排序 — 排序里的"稳定"与这里的"顺序"是同一类考量
- 哈希表 — 与链表一样是"结构决定能力"的代表
- 算法通关训练营·入门篇 — 从基础结构走进算法世界
评论 (0)
正文划词可点「问萝卜特」——自动发评论并由 AI 回复
加载评论中…