📅  最后修改于: 2023-12-03 15:22:26.902000             🧑  作者: Mango
单链表是一种常用的数据结构,但有时我们需要创建一个单链表的副本。递归是一种常用的算法来解决此问题。本文将介绍如何使用递归创建单链表副本的 C 程序。
为了使用递归创建单链表副本,我们需要先定义链表结构。
typedef struct Node {
int val;
struct Node* next;
} Node;
这里我们定义了一个 Node
结构体,包含两个成员变量 —— 值 val
和指向下一个节点的指针 next
。其中 val
可以根据实际情况定义为任意类型。
接下来我们将定义一个递归函数 copy_list
,该函数将返回输入链表的副本。
Node* copy_list(Node* head) {
if (head == NULL) {
return NULL;
}
Node* new_node = malloc(sizeof(struct Node));
new_node->val = head->val;
new_node->next = copy_list(head->next);
return new_node;
}
函数的基本思路为:如果链表为空,则返回 NULL。否则先创建一个新节点,复制原节点的值,并将新节点的 next
指针指向递归调用 copy_list
函数返回的新链表头。
需要注意的是,在创建新节点时应使用 malloc
函数申请内存,调用结束后应使用 free
函数释放内存。
使用示例:
#include <stdio.h>
#include <stdlib.h>
int main() {
// 创建原始链表
Node* head = malloc(sizeof(struct Node));
head->val = 1;
head->next = malloc(sizeof(struct Node));
head->next->val = 2;
head->next->next = malloc(sizeof(struct Node));
head->next->next->val = 3;
head->next->next->next = NULL;
// 创建链表副本
Node* copy_head = copy_list(head);
// 输出链表副本
Node* p = copy_head;
while (p != NULL) {
printf("%d\n", p->val);
p = p->next;
}
// 释放内存
free(head->next->next);
free(head->next);
free(head);
free(copy_head->next->next);
free(copy_head->next);
free(copy_head);
return 0;
}
运行结果:
1
2
3
本文介绍了如何使用递归创建单链表副本的 C 程序,讲解了链表结构的定义、递归函数的定义以及使用示例。在实际应用中,我们可以利用此方法来保证链表数据的安全性,避免副本数据被修改导致原数据被污染。