问题描述
解题思路
-
之所以不采用结构体的方式定义链表结点,是因为每创建一个新结点就要new一次,可能会超时,所以用数组模拟一个静态链表
-
一个数组存储元素,一个数组存储当前元素的下一个元素的索引
-
涉及三种操作:
- 头插法插入数据
- 指定位置插入数据
- 删除指定位置的数据
-
其实保存数据的索引是从零开始递增的,只不过是通过另一数组规定了元素指向【后期利用这个元素前后的关系来遍历】
代码部分
import java.util.Scanner;
public class Main{
static final int N = 100010;
// idx 代表下一个插入的下标,head代表头结点
static int idx = 0;
static int head = -1;
// e 代表元素,ne代表next指向的下标
static int [] e = new int[N];
static int [] en = new int[N];
public static void main(String [] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for(int i = 0; i < n; i++){
char c = sc.next().charAt(0);
if(c == 'H'){
int num = sc.nextInt();
insertFromHead(num);
}else if(c == 'D'){
int k = sc.nextInt();
remove(k);
}else if(c == 'I'){
int k = sc.nextInt();
int num = sc.nextInt();
insertFromK(k, num);
}
}
print();
}
// H头插法插入数据
public static void insertFromHead(int x){
// 创建新结点,让新结点指向头结点的下一个结点,让头结点指向新结点
e[idx] = x;
en[idx] = head;
head = idx;
// 更新
idx++;
}
// I在第k个插入的元素后再插入一个元素
public static void insertFromK(int k, int x){
// 先要找到第k个元素的位置 >> k - 1
e[idx] = x;
en[idx] = en[k - 1];
en[k - 1] = idx;
idx++;
}
// D删除第k个插入的元素后面的那个元素
public static void remove(int k){
if(k == 0){
head = en[head];
}else{
en[k - 1] = en[en[k - 1]];
}
}
// 遍历链表
public static void print(){
for(int i = head; i != -1; i = en[i]){
System.out.print(e[i] + " ");
}
}
}