用c编一个单链表的逆置操作函数
时间: 2023-08-31 18:09:38 浏览: 78
以下是用C语言编写的单链表逆置操作函数:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义单链表节点结构体
struct ListNode {
int val; // 节点存储的值
struct ListNode *next; // 指向下一个节点的指针
};
// 定义单链表逆置函数
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode* prev = NULL; // 前一个节点的指针初始化为NULL
while (head != NULL) { // 当原链表非空时
struct ListNode* next = head->next; // 保存当前节点的下一个节点指针
head->next = prev; // 当前节点指向前一个节点
prev = head; // 更新前一个节点指针
head = next; // 更新当前节点指针
}
return prev; // 返回逆置后新链表的头节点指针
}
int main() {
// 创建一个单链表: 1->2->3->4->5
struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode));
head->val = 1;
struct ListNode *node2 = (struct ListNode *)malloc(sizeof(struct ListNode));
node2->val = 2;
head->next = node2;
struct ListNode *node3 = (struct ListNode *)malloc(sizeof(struct ListNode));
node3->val = 3;
node2->next = node3;
struct ListNode *node4 = (struct ListNode *)malloc(sizeof(struct ListNode));
node4->val = 4;
node3->next = node4;
struct ListNode *node5 = (struct ListNode *)malloc(sizeof(struct ListNode));
node5->val = 5;
node4->next = node5;
node5->next = NULL;
// 打印原链表
printf("Original list: ");
struct ListNode *p = head;
while (p != NULL) {
printf("%d -> ", p->val);
p = p->next;
}
printf("NULL\n");
// 调用逆置函数并打印结果
head = reverseList(head);
printf("Reversed list: ");
p = head;
while (p != NULL) {
printf("%d -> ", p->val);
p = p->next;
}
printf("NULL\n");
// 释放链表节点空间
while (head != NULL) {
struct ListNode *tmp = head;
head = head->next;
free(tmp);
}
return 0;
}
```
输出结果为:
```
Original list: 1 -> 2 -> 3 -> 4 -> 5 -> NULL
Reversed list: 5 -> 4 -> 3 -> 2 -> 1 -> NULL
```