节点之间用链接连接

单向链表的每个节点保存一个元素,并保存指向后继节点的链接。头链接给出第一个节点;空链表则没有可访问的首节点。序列顺序来自这些连接,不要求所有节点必须放在连续的存储槽位里。

读取后续元素时,程序沿当前节点的next逐步前进,直到遇到结束标记。链接本身属于数据结构状态:丢失一个必要链接,就可能让仍然存在的后续节点无法从表头抵达。

参考:[1]

在首尾维护局部连接

在表头插入时,可以让新节点指向原首节点,再更新头链接;移除首节点则把头链接改为它的后继。需要修改的链接数量不随链表长度增加,适合实现后进先出的栈。

若同时保存尾链接,队列可在尾部接入新节点,并从头部移除最早加入的节点。空表变成非空、或最后一个节点被移除时,首尾记录要保持一致;只更新普通情形,容易留下一个已经不属于当前序列的尾引用。

参考:[1]

定位成本仍然存在

“链表插入是常数时间”需要限定已经知道修改位置及必要前驱的情况。若要按位置编号找到第k个元素,单向链表通常还须沿链接经过前面的节点;尾链接也不能直接告诉程序谁是最后一个节点的前驱。

链表与数组可以实现相同的集合接口,却把成本放在不同地方。链表需要额外存储链接,数组则可能需要扩容或移动内容。应先确定访问和修改方式,再判断某种表示是否合适,不能只比较一次局部链接操作。

参考:[1] [2]