链表添加节点

一.题目

描述
输入了一个长度为 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);

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值