实现对不带头结点的单链表进行逆置,不额外增加空间,用c语言
时间: 2024-09-21 19:10:24 浏览: 41
数据结构C语言版之单链表的逆置.cpp
在C语言中,我们可以使用迭代的方式来实现不带头节点的单链表逆置,不需要额外的空间。以下是基本的步骤:
1. 定义一个指针`prev`,初始值设为NULL,它会指向当前节点的前一个节点,用于构建新的逆序链表。
2. 定义一个指针`current`,初始值设为头节点。
3. 进行循环遍历,直到`current`变为NULL:
a. 将`current`的下一个节点赋给`temp`,保存当前节点的下一个节点。
b. 更新`current`的next指针,使其指向`prev`,即完成了当前节点和前一个节点之间的连接。
c. 将`prev`向前移动一位,变成`current`。
d. `current`移到下一个节点,即`current = temp`。
4. 遍历结束后,`prev`将是新的头节点。
下面是一个简单的C代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
void reverseList(Node** head) {
if (*head == NULL || (*head)->next == NULL) return; // 如果链表为空或只有一个节点,无需反转
Node *prev = NULL, *current = *head;
while (current != NULL) {
Node *temp = current->next;
current->next = prev;
prev = current;
current = temp;
}
*head = prev; // 更新头节点
}
// 打印链表
void printList(Node* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
int main() {
Node* head = malloc(sizeof(Node)); // 创建一个空链表
// 添加一些节点...
printf("Original List:\n");
printList(head);
reverseList(&head); // 逆置链表
printf("Reversed List:\n");
printList(head);
free(head); // 清理内存
return 0;
}
```
阅读全文