题解 | 牛牛的链表添加节点
牛牛的链表添加节点
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;
}
不用再创建表头的方法实现链表结点的增加
查看21道真题和解析