引入链表
数组的特点:
1、有元素、下标概念。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | … |
2、大小固定,比如定义 int a[1000];
3、数据是连续存储的,比如通常 N=3,就是 a[0]、a[1]、a[2] 三个元素。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | … |
7 | 42 | 93 |
4、查找、插入、删除元素时间复杂度都是O(N)
5、存取第i个元素时间复杂度都是O(1)
有些任务,数据是不连续存放的;插入、删除操作多需要快速。因此产生了链表数据结构。比如:
【例1】下一个同类
动物园里有26种动物,分别用大写字母’A’~’Z’表示。这些N只动物从左到右排成一行,位置从0到N-1。共有M个提问,每个提问是第i个位置上的动物想知道它的右边下一个同类的位置。如果它右边没有同类的动物了,就输出-1。
输入格式
第一行:2个整数N和M,范围在[1,1000000]。
第二行:一个长度为N的大写字母字符串。
第三行:M个整数,范围在[0,N-1]。
输出格式
一行,M个整数,输出相应问题的右边同类的位置,没有输出-1。
输入样例
10 5
ABCADCBABC
0 2 4 5 6
输出样例
3 5 -1 9 8。
【分析】
如果简单使用数组每个元素都查找一次右边的,显然时间复杂度为O(M*N)。
如果链表数据结构,就可以快速知道答案。
例如下面是关于A的信息
可以对’B’、’C’、’D’等都做类似的处理。