题解 | 牛牛的链表添加节点

牛牛的链表添加节点

https://www.nowcoder.com/practice/e33b79c2e15a41f9b541e73cd256124a

#include <stdio.h>
#include <stdlib.h>

// 链表节点定义
typedef struct Lnode {
    int data;
    struct Lnode* next;
} Lnode, *LinkList;

// 尾插法创建链表(无表头,直接返回首元节点)
LinkList CreateLinkList(int n, int* a) {
    if (n == 0) return NULL;
    // 创建首元节点
    LinkList head = (Lnode*)malloc(sizeof(Lnode));
    head->data = a[0];
    head->next = NULL;
    LinkList tail = head;

    for (int i = 1; i < n; i++) {
        Lnode* new_node = (Lnode*)malloc(sizeof(Lnode));
        new_node->data = a[i];
        new_node->next = NULL;
        tail->next = new_node;
        tail = new_node;
    }
    return head;
}

// 在第i个节点后插入值为val的新节点(i从1开始计数)
LinkList addLnode(LinkList head, int i, int val) {
    if (head == NULL || i <= 0) {
        printf("插入位置非法!\n");
        return head;
    }

    Lnode* p = head;
    int count = 1; // 从第1个节点开始计数

    // 找到第i个节点
    while (p != NULL && count < i) {
        p = p->next;
        count++;
    }

    // 位置超出链表长度,直接返回
    if (p == NULL) {
        printf("插入位置非法!\n");
        return head;
    }

    // 创建新节点
    Lnode* new_node = (Lnode*)malloc(sizeof(Lnode));
    new_node->data = val;

    // 核心插入操作:先连后,再连前
    new_node->next = p->next;
    p->next = new_node;

    return head;
}

// 打印链表
void Print(LinkList L) {
    Lnode* p = L;
    while (p != NULL) {
        if (p->next == NULL) {
            printf("%d", p->data);
        } else {
            printf("%d ", p->data);
        }
        p = p->next;
    }
    printf("\n");
}

int main() {
    int n, i;
    scanf("%d%d", &n, &i);

    int* arr = (int*)malloc(n * sizeof(int));  
    for (int j = 0; j < n; j++) {
        scanf("%d", &arr[j]);
    }
  

    // 创建链表
    LinkList L = CreateLinkList(n, arr);
    // 插入节点:在第i个节点后插入值为i的节点
    L = addLnode(L, i, i);
    // 打印结果
    Print(L);

    free(arr);
    return 0;
}

不用再创建表头的方法实现链表结点的增加

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务