定义
用两个数组实现链表,一个数组存储数据,另一个数组记录当前数据的后继的下标。
示例
数据:data[] = {-1, 34, 28, 53, 16, 25, -1, -1, -1, -1}
后继:next[] = { 1, 2, 3, 4, 5, -1, -1, -1, -1, -1}
说明
-1: 表示无效值
- data[0],无数据值,表示头节点
- next[0]为1,表示data[0]的后继为data[1]
- next[1]为2,表示data[1]的后继为data[2]
- next[2]为3,表示data[2]的后继为data[3]
- next[3]为4,表示data[3]的后继为data[4]
- next[4]为5,表示data[4]的后继为data[5]
操作
- 插入
如:在28,前面插入17,则数组变化为
数据:data[] = {-1, 34, 28, 53, 16, 25, 17, -1, -1, -1}
后继:next[] = { 1, 6, 3, 4, 5, 2, -1, -1, -1, -1}
说明:data数组,从下标1(下标0表示头结点)开始找到第一个无效值,当前为下标为6,将其设置为插入的数值,即data[6] = 17;调整34的后继为6,即next[1] = 6;调整17的后继为28,即next[6] = 2; - 删除
如:删除53,则数据变化为
数据:data[] = {-1, 34, 28, -1, 16, 25, 17, -1, -1, -1}
后继:next[] = { 1, 6, 4, -1, 5, 2, -1, -1, -1, -1}
说明:找到后继节点为53的节点(28),下标为2;保存28的后继下标,即next[2](值为3);设置28的后继为其后继的后继,即next[2] = next[next[2]];设置下标3的数据及后继数组为-1,即data[3] = -1,next[3] = -1
扩展
- 循环链表
后继数组中,设置最后一个节点的后继为头结点,如:
数据:data[] = {-1, 34, 28, 53, 16, 25, -1, -1, -1, -1}
后继:next[] = { 1, 2, 3, 4, 5, 0, -1, -1, -1, -1} - 双向链表
增加一个前驱数组,标识数据的前驱的下标,如
数据:data[] = {-1, 34, 28, 53, 16, 25, -1, -1, -1, -1}
后继:next[] = { 1, 2, 3, 4, 5, 0, -1, -1, -1, -1}
前驱:prex[] = { 5, 0, 1, 2, 3, 4, -1, -1, -1, -1}
参考《算法训练营》