线性表 - 链表
由于链表各元素的内存地址并非连续的,零星散落在存储器中,为了表示当前元素与其后继元素之间的逻辑关系,每个元素除了要保存数据信息外,还需要存储其直接后继元素的存储位置,这种存储结构称为链式表,也称为链表。
我们将链表中存储数据信息的域称为数据域,将存储直接后继元素位置信息的域称为指针域。指针域中存储的信息被称为指针,链表中的每个元素被称为结点(Node)。
如果一个 Node 中只有一个指针域,则被称为单链表。
我们将链表中第一个结点的存储位置叫做头指针。有时候为了更加方便地对链表操作,会在单链表的第一个结点前设置一个结点,称为头结点。头结点的数据域可以不存储任何信息,也可以存储线性表长度等附加信息,头结点的指针域存储指向第一个结点的指针。在单链表中最后一个结点的指针为空,用 NULL 表示。
将单链表中最后一个结点的指针域由空改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表。
如果一个 Node 中有两个指针域,其中一个存储当前元素后继元素的地址信息,另外一个存储当前元素前驱元素的地址信息,则被称为双向链表。和单向循环链表类似,如果双向链表的最后一个结点的后向指针域指向头结点,而头结点的前向指针域指向最后一个结点,则该链表被称为双向循环链表。
如果让数组中的每个元素都由两个数据域组成:data 和 curr。data 表示数据域,用于存放数据;curr 相当于单链表中的 next 指针,存放该元素后继元素在数组中的下标。我们将这种用数组描述的链表叫做静态链表。静态链表中的第 0 个和最后一个元素一般不存数据,且将未被使用的数组元素成为备用链表。第 0 个个元素的 curr 存放备用链表的第一个结点的下标,最后一个元素的 curr 存放第一个有数组元素的下标,相当于单链表中的头结点。