逆置单链表C语言

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


typedef struct Lnode{
int data;
struct Lnode *next;
}lnode;


lnode *head;


lnode *create_Linklist(void){
int data;
lnode  *p;
head = (lnode *)malloc(sizeof(lnode));
head->next = NULL;
while (1){
scanf_s("%d", &data);
if (data == 32767) break;
else {
p = (lnode *)malloc(sizeof(lnode));
p->data = data;
p->next = head->next;
head->next = p;
}
}
return (head);
}//头插入法建立单链表。




void PrintfLnode(lnode *L){
lnode *p;
p = L->next;


printf("单链表的值为:");


while (p != NULL){
printf("%d  ", p->data);
p = p->next;
}
}//输出单链表


lnode* NizhiLnode(lnode *L){
lnode *head = L;
if (L == NULL || L->next == NULL){
return (head);
}
else{
lnode *p = L->next;
head=NizhiLnode(p);
p->next = L;
L->next = NULL;
return (head);
}
}//递归逆置单链表


void PrintfLnode2(lnode *L){
lnode *p;
p = L;


printf("\n");


while (p->next != NULL){
printf("%d  ", p->data);
p = p->next;
}
}


int main(){
lnode *T,*p;
printf("请输入单链表的值:");
T = create_Linklist();
PrintfLnode(T);
printf("\n逆置单链表的值:");
p=NizhiLnode(T);
PrintfLnode2(p);
return 0;

}


### C语言递归实现单链表的代码及方法 以下内容详细描述了如何使用C语言递归实现单链表,包括完整的代码示例和方法说明。 #### 方法概述 递归实现单链表的核心思想是通过递归调用处理后续节点的,并在返回过程中调整当前节点与已部分的关系。具体而言,当递归到达链表末尾时,最后一个节点成为新的头节点。然后逐层返回,将当前节点的 `next` 指针指向其前一个节点,同时将当前节点的 `next` 为 `NULL` 以避免形成环[^1]。 #### 完整代码示例 ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构 typedef struct LinkedNode { int data; struct LinkedNode* next; } LinkedNode; // 创建新节点 LinkedNode* create_node(int data) { LinkedNode* node = (LinkedNode*)malloc(sizeof(LinkedNode)); node->data = data; node->next = NULL; return node; } // 打印链表 void print_list(LinkedNode* head) { while (head != NULL) { printf("%d ", head->data); head = head->next; } printf("\n"); } // 递归链表 LinkedNode* reverse_list_recursive(LinkedNode* head) { if (head == NULL || head->next == NULL) { return head; // 当前节点成为新的头节点 } LinkedNode* new_head = reverse_list_recursive(head->next); // 递归后续节点 head->next->next = head; // 调整当前节点与已部分的关系 head->next = NULL; // 避免形成环 return new_head; } // 测试代码 int main() { // 创建链表 1 -> 2 -> 3 -> 4 -> 5 LinkedNode* head = create_node(1); head->next = create_node(2); head->next->next = create_node(3); head->next->next->next = create_node(4); head->next->next->next->next = create_node(5); printf("Original list: "); print_list(head); // 链表 head = reverse_list_recursive(head); printf("Reversed list: "); print_list(head); return 0; } ``` #### 方法解析 - **递归终止条件**:当链表为空或只有一个节点时,直接返回该节点作为新的头节点。 - **递归调用**:递归地从第二个节点开始的子链表。 - **调整指针**:在返回过程中,将当前节点的下一个节点指向当前节点,完成关系的调整。 - **避免环形链表**:将当前节点的 `next` 指针设为 `NULL`,以确保不会形成环形链表[^1]。 #### 示例运行结果 假设输入链表为 `1 -> 2 -> 3 -> 4 -> 5`,程序输出如下: ``` Original list: 1 2 3 4 5 Reversed list: 5 4 3 2 1 ``` #### 注意事项 - 在递归实现中,需要特别注意链表为空或只有一个节点的情况,这是递归终止的条件。 - 递归实现可能会导致栈溢出问题,尤其是在链表长度较大时。因此,在实际应用中需根据具体情况选择递归或非递归实现方式[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值