单链表 - 双链表
1. 单链表 (singly linked list)
单链表是一种使用指针来存储值的数据结构。链表中的每个节点包含一个字段,用于指向链表的下一个节点。另外有一个独立的根指针指向链表的第 1 个节点。由于节点在创建时是采用动态分配内存的方式,所以它们可能分布于内存之中。遍历链表是根据指针进行的,所以节点的物理排列无关紧要。单链表只能以一个方向进行遍历。
为了把一个新值插入到一个有序的单链表中,你首先必须找到链表中合适的插入位置。对于无序单链表,新值可以插入到任何位置。把一个新节点链接到链表中需要两个步骤。首先,新节点的 link
字段必须设置为指向它的目标后续节点。其次,前一个节点的 link
字段必须设置为指向这个新节点。在许多其他语言中,插入函数保存一个指向前一个节点的指针来完成第 2 个步骤。但是,这个技巧使插入到链表的起始位置成为一种特殊情况,需要单独处理。在 C 语言中,你可以通过保存一个指向必须进行修改的 link
字段的指针,而不是保存一个指向前一个节点的指针,从而消除了这个特殊情况。
2. 双链表 (doubly linked list)
双链表中的每个节点包含两个 link
字段:其中一个指向链表的下一个节点,另一个指向链表的前一个节点。双链表有两个根指针,分别指向第 1 个节点和最后一个节点。因此,遍历双链表可以从任何一端开始,而且在遍历过程中可以改变方向。为了把一个新节点插入到双链表中,我们必须修改 4 个指针。新节点的前向和后向 link
字段必须被设置,前一个节点的后向 link
字段和后一个节点的前向 link
字段也必须进行修改,使它们指向这个新节点。