18. 链表的基本操作
时间限制:1.000S 空间限制:32MB
题目描述
本题考察链表的基本操作。温馨提示:本题较为复杂,需要细心多花一些时间。
输入描述
输入数据只有一组,第一行有n+1个整数,第一个整数是这行余下的整数数目n,后面是n个整数。 这一行整数是用来初始化列表的,并且输入的顺序与列表中的顺序相反,也就是说如果列表中是1、2、3那么输入的顺序是3、2、1。 第二行有一个整数m,代表下面还有m行。每行有一个字符串,字符串是“get”,“insert”,“delete”,“show”中的一种。
如果是“get”,代表获得第a个元素。(a从1开始计数) 如果是“delete”,代表删除第a个元素。(a从1开始计数) 如果是“insert”,则其后跟着两个整数a和e,代表在第a个位置前面插入e。(a从1开始计数) “show”之后没有正数,直接打印链表全部内容。 输出描述 如果获取成功,则输出该元素; 如果删除成功,则输出“delete OK”; 如果获取失败,则输出“get fail” 如果删除失败,则输出“delete fail” 如果插入成功,则输出“insert OK”,否则输出“insert fail”。 如果是“show”,则输出列表中的所有元素,如果列表是空的,则输出“Link list is empty” 注:所有的双引号均不输出。
输入示例
3 3 2 1
21
show
delete 1
show
delete 2
show
delete 1
show
delete 2
insert 2 5
show
insert 1 5
show
insert 1 7
show
insert 2 5
show
insert 3 6
show
insert 1 8
show
get 2
输出示例
1 2 3
delete OK
2 3
delete OK
2
delete OK
Link list is empty
delete fail
insert fail
Link list is empty
insert OK
5
insert OK
7 5
insert OK
7 5 5
insert OK
7 5 6 5
insert OK
8 7 5 6 5
7
提示信息
初始化链表的元素是倒序的,这个使用题目中创建列表的方法(从头部插入)就可以了。
解法一(模拟)
思路分析:
- 按照题目意思进行模拟
- 可以使用Java自带的链表数据结构,也可以手动实现对应的链表数据结构
实现代码如下:
public class k_18_BasicOperationsLinkedList {
static LinkedList<Integer> linkedList;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 获取序列长度
int n = in.nextInt();
linkedList = new LinkedList<>();
// 从头插入序列
while (n-- > 0) {
linkedList.addFirst(in.nextInt());
}
// 获取接下来的操作次数
int m = in.nextInt();
while (m-- > 0) {
String operation = in.next();
switch (operation) {
case "get":
get(in.nextInt());
break;
case "insert":
insert(in.nextInt(), in.nextInt());
break;
case "delete":
delete(in.nextInt());
break;
case "show":
show();
break;
}
}
// 清除
linkedList.clear();
}
private static void get(int index) {
int size = linkedList.size();
if (index <= size && index >= 1) {
System.out.println(linkedList.get(index-1));
} else {
System.out.println("get fail");
}
}
private static void insert(int index, int element) {
int size = linkedList.size();
if (index <= size+1 && index >= 1) {
linkedList.add(index-1, element);
System.out.println("insert OK");
} else {
System.out.println("insert fail");
}
}
private static void delete(int index) {
int size = linkedList.size();
if (index <= size && index >= 1) {
linkedList.remove(index-1);
System.out.println("delete OK");
} else {
System.out.println("delete fail");
}
}
private static void show() {
if (linkedList.isEmpty()) {
System.out.println("Link list is empty");
} else {
// 按顺序输出
int size = linkedList.size();
for (int i = 0; i < size; ++ i) {
System.out.print(linkedList.get(i));
if (i != size-1) {
System.out.print(" ");
}
}
System.out.println();
}
}
}
运行结果如下:
运行时间: 601ms 消耗内存: 13056kb
复杂度分析:
- 时间复杂度:
- 空间复杂度: