一.题目
描述
输入了一个长度为 n 的数组,他把这个数组转换成链表并在第 i 个节点的后面添加一个值为 i 的新节点
输入描述:
第一行输入两个正整数分别是 n 和 i ,表示数组的长度、需要添加节点的位置和节点的值
第二行输入 n 个正整数表示数组中每个元素的值。
输出描述:
把数组转换成链表并在第 i 个节点后的添加一个新节点值,新节点的值是 i。
示例1
输入:
5 3
5 4 8 6 3
复制
输出:
5 4 8 3 6 3
二.思路
首先要先要用指向整数的指针(当作数组使用)接收输入的数字,其次创建链表,使用尾部插入法,得到与输入顺序一样的链表,最后
step1:先要用指向整数的指针(当作数组使用)接收输入的数字
int n, idx;
scanf("%d %d", &n, &idx);
int* arr = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
这里的 arr
是一个指向 int
类型的指针。借助 malloc
函数,它会分配一块能存储 n
个整数的连续内存空间,接着 arr
就指向这块内存的起始位置。从功能上看,arr
可以当作数组来使用,比如 arr[i]
这种访问方式。
step2:创建链表
尾部插入法
// 创建链表
struct node* head = NULL;
struct node* tail = NULL;
for (int i = 0; i < n; i++) {
struct node* current = (struct node*)malloc(sizeof(struct node));
current->data = arr[i];
current->next = NULL;
if (head == NULL) {
head = current;
tail = current;
} else {
tail->next = current;
tail = current;
}
}
step3:插入新节点
将curent链表移动到要插入的节点位置下面,之后判断这个位置是否是存在,如果存在创建一个新的链表,它的data指向要插入的数,next指向要插入的位置的后一个数据,之后将curent的next指向的地方由原来指向的改成新节点的
// 在第idx个节点后插入新节点(值为idx)
struct node* current = head;
// 移动到第idx个节点(注意链表索引从0开始)
for (int i = 0; i < idx-1 && current != NULL; i++) {
current = current->next;
}
// 插入新节点
if (current != NULL) {
struct node* new_node = (struct node*)malloc(sizeof(struct node));
new_node->data = idx;
new_node->next = current->next;
current->next = new_node;
}
step4:输出链表,释放内存
// 输出链表
current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
// 释放内存
current = head;
while (current != NULL) {
struct node* temp = current;
current = current->next;
free(temp);
}