用c语言写一个算法将单链表逆置。要求逆置在原表上进行,不允许重构新表。要求带有注释的程序以及打印逆置值之前的表和逆置之后的表。
时间: 2024-11-27 10:15:34 浏览: 29
```c
#include <stdio.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 交换两个节点指针的函数
void swap(Node** a, Node** b) {
Node* temp = *a;
*a = *b;
*b = temp;
}
// 链表逆置的函数,递归实现
void reverseList(Node** head) {
// 如果链表为空或者只有一个元素,无需逆置
if (*head == NULL || (*head)->next == NULL) {
return;
}
// 选择最后一个元素作为新的头结点
Node* last = (*head)->next->next;
// 将第一个元素指向剩余部分,并更新最后一个元素的下一个指针
(*head)->next->next = NULL; // 更新链表尾部
swap(&(*head), &last);
// 对剩余部分递归地进行逆置操作
reverseList(&(*head)->next);
}
// 打印链表的函数
void printList(Node* head) {
while (head != NULL) {
printf("%d -> ", head->data);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 创建示例链表
Node* list = (Node*)malloc(sizeof(Node));
list->data = 1;
list->next = (Node*)malloc(sizeof(Node));
list->next->data = 2;
list->next->next = (Node*)malloc(sizeof(Node));
list->next->next->data = 3;
list->next->next->next = (Node*)malloc(sizeof(Node));
list->next->next->next->data = 4;
list->next->next->next->next = NULL;
printf("Original List:\n");
printList(list); // 原始链表
// 逆置链表
reverseList(&list);
printf("\nReversed List:\n");
printList(list); // 逆置后的链表
free(list); // 释放内存
return 0;
}
```
在这个程序中,我们首先创建了一个简单的单链表,然后通过递归的方式逆置了这个链表,同时保持在原链表上修改。最后,我们打印出逆置前后的链表内容。
阅读全文