设计一个算法,将链表中所有节点的链接方向“原地”逆转,即要求仅利用原表的存储结构,换句话说,要求算法的空间复杂度为O(1)。使用c语言编写
时间: 2024-09-25 12:08:59 浏览: 47
C++版本将两个有序链表合并为一个新的有序链表并返回原理及代码实现
设计这样一个算法,可以使用迭代的方式来实现。以下是使用C语言编写的原地反转链表的算法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 反转链表函数
void reverseList(ListNode **head) {
if (*head == NULL || (*head)->next == NULL) { // 如果链表为空或只有一个元素,则无需反转
return;
}
ListNode *prev = NULL; // 初始化前驱节点为NULL
ListNode *current = *head; // 当前节点初始化为头节点
while (current != NULL) { // 遍历整个链表
ListNode *temp = current->next; // 保存当前节点的下一个节点
current->next = prev; // 将当前节点的next指向前一个节点
prev = current; // 更新前驱节点为当前节点
current = temp; // 移动到下一个节点
}
*head = prev; // 最终的头节点将是原链表的尾节点
}
// 打印链表函数
void printList(ListNode *head) {
while (head != NULL) {
printf("%d -> ", head->val);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 创建一个示例链表
ListNode* list = (ListNode*)malloc(sizeof(ListNode));
list->val = 1;
list->next = (ListNode*)malloc(sizeof(ListNode));
list->next->val = 2;
list->next->next = (ListNode*)malloc(sizeof(ListNode));
list->next->next->val = 3;
list->next->next->next = NULL;
printf("Original list:\n");
printList(list);
reverseList(&list); // 调用反转函数
printf("\nReversed list:\n");
printList(list);
return 0;
}
```
阅读全文