← 返回内容列表

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

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

你每次点"后退""前进",背后是一张双向链表在默默记录历史。今天用浏览器历史这个人人都用过的例子,讲清双向链表"正反都能走、且能 O(1) 自删"的独特价值。

打开浏览器,访问 A→B→C,再点"后退"回到 B,接着访问 D——这时"前进"到 C 的按钮消失了。这套看似理所当然的行为,底层正是双向链表

为什么是双向链表?历史记录本质上是一个序列,你需要能向前走(前进)也能向后走(后退),而单链表只能单向。双向链表每个节点带 prev 和 next,天然支持两个方向遍历。

"访问新页面就截断前进历史"怎么实现?当在 B 处点开新页面 D 时,系统把 B 之后的整段(C 及其后续)从链表中摘除。双向链表的优势在此显现:只要拿到当前节点 B,就能 O(1) 把它后面的节点整段断开,而不必先遍历找前驱。单链表做不到这一点(删后面容易,但"丢弃后面整段"仍需处理指针)。

再抽象一层:任何"需要双向导航 + 频繁在当前位置增删后续"的场景——文本编辑器的光标历史、音乐播放器的播放队列、撤销重做栈——都能用双向链表干净地建模。它比单链表多一个指针的代价,在这些场景里完全值回票价。

双向链表记录前进/后退页1页2页3页4在页2开新页 → 截断其后整段(前进历史消失)双向链表:拿到当前节点即可 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 回复

加载评论中…