单链表动画演示

节点靠指针串起来,插入删除只改箭头不搬数据。

键盘:← → 单步 ·空格 播放/暂停 · R 重置 ·Home/End 到两端

单链表的每个节点只认识自己的下一个,所以它换来换去只有一件事:改 next 指针。插入和删除因此不必搬运任何数据,两次赋值就结束。代价是按序号访问必须从头一格一格走,这一点页面上每个 O(n) 操作都单独累计了「向后走」的次数,走多少格一目了然。

删除必须带着前驱一起走,这是单链表最硬的约束:给定一个节点,你没法倒回去改它前面那个的 next,所以在找到目标的同时必须记住上一个。反转更明显——三个指针各管一段:prev 是已经翻好的那段的头,cur 是正要改向的节点,next 是提前备份的下游。next 不先存下来,cur.next 一被覆盖,后半条链就永久断了。

单链表演示怎么用

  • 读 sub:节点上那行小字写的是它的 next 指向谁,∅ 表示链尾。反转过程中物理位置钉住不动,只有这行小字在改,最后一步才把数组顺序整理成新的链表次序。
  • 三种操作都跑到:页面上依次演示队头插入、指定前驱之后插入、按值查找命中、查找落空、删除,最后整体反转,一个都不缺。
  • 换数据:规模条控制建链时接几个节点,自定义栏可以直接写一串值。值重复时查找与删除只处理最先匹配到的节点,note 会写明是第几个。
  • 看计数:比较、向后走、插入、删除、改向分开累计。反转那段只加改向计数,不产生新建或销毁——它一个节点都没动。

常见问题

反转链表的三个指针分别是谁?

prev 存已经反转部分的新头,开始时是空;cur 是正在处理的那个;next 先备份 cur 原来的下一个。每轮做四件事:备份、改向、prev 前进、cur 前进,循环结束 prev 就是新的头。

为什么删除给的是节点本身却要 O(n)?

只有当你能拿到它的前驱时删除才是 O(1)。单链表通常按值找,找的过程就要走一遍;双向链表因为节点自己认前驱,才真正做到拿到就删。

链表和数组到底怎么选?

看操作而不是看数据量。频繁在中间插删、且大小不好预估,链表省掉搬运;要按下标跳着读、要缓存友好、要二分,数组完胜。真实工程里还常用「数组分段」代替纯链表,兼顾两头。

哑节点(dummy head)有什么用?

在头前面挂一个哨兵,插入删除就不用为「改的是不是头节点」写特判:所有操作统一走「找到前驱,改前驱的 next」。代价是每次多走一格,换来少一个容易漏的分支。

演示编号 B04无需安装,手机端同样可用按 Ctrl + K 搜工具与演示

顺手能用上的工具