设计一个算法,将一个带头结点的数据域依次为 a1、a2、...、an(n≥3)的单链表 的所有结点逆置,即第一个结点的数据域变为 an,第 2 个结点的数据域变为 an-1,...,尾 结点的数据域为 a1。c语言
时间: 2024-09-22 07:05:08 浏览: 42
数据结构期末考试试题与答案.doc
在C语言中,我们可以设计一个递归算法来反转单链表。这里是一个基本的实现思路:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val; // 数据域
struct ListNode *next; // 指向下一个节点的指针
} ListNode;
// 创建新节点
ListNode* createNode(int val) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 反转链表的辅助函数(递归)
ListNode* reverseListRec(ListNode* head) {
if (head == NULL || head->next == NULL) {
// 链表只有一个元素或为空,直接返回
return head;
}
// 递归处理剩余部分
ListNode* rest = reverseListRec(head->next);
// 将当前节点的next指向头节点,完成反转
head->next->next = head;
head->next = NULL;
return rest;
}
// 主函数测试
void printList(ListNode* head) {
ListNode* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->val);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
// 初始化一个示例链表
ListNode* head = createNode(1);
head->next = createNode(2);
head->next->next = createNode(3);
head->next->next->next = createNode(4);
printf("Original list: ");
printList(head);
head = reverseListRec(head); // 反转链表
printf("\nReversed list: ");
printList(head);
return 0;
}
```
阅读全文