单链表逆转(数据结构)C语言

单链表逆转(数据结构)

此题是参考了很多博主总结了一下自己觉得最好理解的

本题要求实现一个函数,将给定的单链表逆转。

函数接口定义

List Reverse( List L );

其中List结构定义如下:

typedef struct Node *PtrToNode;
struct Node {
   
   
    ElementType Data; /* 存储结点数据 */
    PtrToNode   Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */

L是给定单链表,函数Reverse要返回被逆转后的链表。

裁判测试程序样例:

#include <stdio
### C语言单链表逆序输出实现方法 在C语言中,可以通过多种方式实现单链表的逆序输出。以下是两种常见的方法:一种是通过递归的方式逐层访问节点并打印;另一种则是先反转整个链表结构再顺序遍历。 #### 方法一:递归法 递归是一种自然适合解决此类问题的技术。其基本思路是从当前节点出发,一直深入到链表末端,在回溯过程中依次打印各节点的数据值[^1]。 ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node; // 打印函数(递归) void PrintReverseRecursive(Node* head) { if (head == NULL) return; // 基本条件判断 PrintReverseRecursive(head->next); // 递归调用下一层 printf("%d ", head->data); // 输出数据部分 } int main() { // 创建测试链表... Node* head = malloc(sizeof(Node)); head->data = 1; head->next = malloc(sizeof(Node)); head->next->data = 2; head->next->next = malloc(sizeof(Node)); head->next->next->data = 3; head->next->next->next = NULL; PrintReverseRecursive(head); // 清理内存资源... free(head->next->next); free(head->next); free(head); return 0; } ``` 上述代码展示了如何利用递归来完成单链表的逆向打印操作[^1]。 #### 方法二:原地翻转后再正向遍历 这种方法首先会改变原始链表的方向使其成为反方向链接的形式,之后按照常规方式进行前向迭代即可达到目的[^2]。 ```c #include <stdio.h> #include <stdlib.h> typedef struct SListNode { int value; struct SListNode* next; } SListNode; SListNode* ReverseList(SListNode* pHead){ SListNode *prev=NULL,*current=pHead,*next=NULL; while(current!=NULL){ next=current->next;//保存下一个节点的信息 current->next=prev;//修改当前节点指向它的前驱节点 prev=current;//前进一位 current=next; } return prev; } void TraverseAndPrint(SListNode* node){ while(node != NULL){ printf("%d ",node->value); node=node->next; } } int main(){ /* 构建简单的链表 */ SListNode n1={1,NULL}; SListNode n2={2,&n1}; SListNode n3={3,&n2}; SListNode* head=&n3; // 调用反转逻辑 SListNode* reversed_head=ReverseList(head); // 遍历新形成的列表 TraverseAndPrint(reversed_head); return 0; } ``` 此段程序实现了完整的单链表逆转以及后续正常次序读取的过程[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值