思路
我们可以采用结构体的方法定义静态链表,但是在算法考试中,考虑到程序运行速度和代码简洁程度,我们通常使用两个数组data[]、next[]
来表示当前结点存放的值和当前结点的下一个结点的地址值,当前结点的地址值作为数组下标(类似散列表映射的思想);同时我们还需要定义一个数组list[]
来根据不同要求的顺序存放的当前结点的地址值……听起来可能有点绕口。但是这种方法确实能大大减少代码量,建议经过几次的认真揣摩和实践去掌握这种定义方式。
步骤
- 定义三个数组、输入三种值
int data[maxn], next[maxn], list[maxn];
int temp;
for(int i = 0; i < n; i++)
{
cin >> temp; //输入当前结点的地址值
cin >> data[temp] >> next[temp]; //输入当前结点存放的值和下一个结点的地址值
}
- 过滤无效节点并且按顺序在
list[]
中存储结点值
! 注意(丢分点) : 输入可能会给出不在这个链表里的结点(无效结点),导致最后输出的时候发生错误,因此要定义一个int cnt
记录有效结点的数量。
int cnt = 0; //Link to -> "!注意(丢分点)"
while(first != -1)
{
list[cnt++] = first; //first是头结点,会在题目中给出
first = next[first];
}
- 根据题目要求对
list[]
列表中存放的地址值进行操作,举个栗子,加入题目要求反转链表,我们应该这样做:
for(int i = 0; i < cnt; i++) //注意是cnt哦!
reverse(list.begin(), list.end());
- 最后输出,输出考虑到题目输出格式的要求会有很多种不同的方法,这里记录一种比较简洁的写法:
for(int i = 0; i < cnt - 1; i++)
printf("%05d %d %05d\n", list[i], data[list[i]], list[i + 1]);
printf("%05d %d -1", list[cnt - 1], data[list[cnt - 1]]);
相关题目
B1025、B1075、B1105
代码可以参考柳婼姐姐的。