尾插法

来自GSXAB的知识库

尾插法指通过不断在链表尾部插入元素来构造链表的算法。也指这一算法中,向链表尾部插入一个元素这一步骤的操作。

这一算法需要知道尾结点的位置,因为连续构造时很容易知道尾结点所在,这个算法经常用于连续构造。 对双向链表头尾算法对称没有问题,但是对已经存在较长的单向链表,插入尾部需要提前知道尾部,会需要遍历整个链表。

这使得实际使用尾插法的场景,经常是接在一个必须完整遍历链表的算法后,以免需要引入额外的时间复杂度。

也存在给单向链表保存链表头尾结点指针的变体实现, 但是维护单向链表尾部指针意味着无法随意删除结点, 否则尾结点无法被删除,因为需要知道倒数第二个结点的指针才能操作指向尾结点的指针或者将指针从最后结点移动到倒数第二个结点。

算法

尾插法中:

  1. 将每个元素依次插入链表尾部。

将元素插入尾部:

需要已知指针指向当前链表的尾结点(或为空,当链表本身为空时)。

  1. 构造新的结点,将要插入的元素放在结点的数据域中。
  2. 使当前尾结点的链接指向新结点。
  3. (若是双链表,或者说存在反向链接)修改新结点的反向链接指向当前尾结点。
  4. 使标记尾结点的指针指向新结点。

linked_list_tail_insert.svg

对于多个连续插入的情况,改变新结点链接为尾部标记会被覆盖,只需要在循环外为最后一个尾结点执行。