写一个单链表反转的c程序代码
时间: 2023-11-28 11:51:20 浏览: 57
以下是一个简单的单链表反转的C程序代码:
```c
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
void reverse(struct Node** head) {
struct Node* prev = NULL;
struct Node* current = *head;
struct Node* next = NULL;
while (current != NULL) {
next = current->next;
current->next = prev;
prev = current;
current = next;
}
*head = prev;
}
void push(struct Node** head_ref, int new_data) {
struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
new_node->data = new_data;
new_node->next = (*head_ref);
(*head_ref) = new_node;
}
void printList(struct Node* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
}
int main() {
struct Node* head = NULL;
push(&head, 5);
push(&head, 4);
push(&head, 3);
push(&head, 2);
push(&head, 1);
printf("Original list: ");
printList(head);
printf("\nReversed list: ");
reverse(&head);
printList(head);
return 0;
}
```
这个程序首先定义了一个 `Node` 结构体来表示链表中的节点,包括节点的数据和指向下一个节点的指针。然后定义了三个指针变量 `prev`, `current`, `next` 来实现反转操作,其中 `prev` 表示前一个节点,`current` 表示当前节点,`next` 表示下一个节点。
`reverse` 函数用于反转链表,首先将 `prev` 和 `current` 初始化为 `NULL` 和 `head`,然后在一个 `while` 循环中遍历整个链表,每次将 `current` 的 `next` 指针指向 `prev`,然后将 `prev` 和 `current` 向后移动一个节点,直到 `current` 为 `NULL`,最后将 `head` 指向 `prev`,完成链表的反转。
`push` 函数用于向链表中插入一个新节点,首先分配一个新节点的内存空间,然后将新节点的 `next` 指针指向当前链表头节点,最后将链表头指针指向新节点。
`printList` 函数用于打印整个链表的节点数据。
在 `main` 函数中,首先创建一个空链表,然后通过 `push` 函数向其中插入若干个节点,最后打印原始链表和反转后的链表。
阅读全文