设计一个算法,将链表中所有节点方向原地逆转,要求仅利用原表的存储空间 换句话说,要求算法的空间复杂度为O(1)用C语言
时间: 2024-09-30 11:15:47 浏览: 34
设计一个只改变链表节点方向而不使用额外空间的原地翻转链表算法(空间复杂度为O(1))可以使用迭代的方式,以下是C语言的一种实现思路:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 只修改原链表节点指向的辅助函数
void reverseList(ListNode **head) {
ListNode* prev = NULL;
ListNode* curr = *head;
ListNode* nextTemp;
// 当前节点指向下一位,然后交换两个节点的指向
while (curr != NULL) {
nextTemp = curr->next;
curr->next = prev;
prev = curr;
curr = nextTemp;
}
// 更新头指针,使新头成为之前链表的尾部
*head = prev;
}
// 测试函数
void printList(ListNode *head) {
ListNode *temp = head;
while (temp != NULL) {
printf("%d -> ", temp->val);
temp = temp->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: ");
printList(list);
reverseList(&list);
printf("Reversed List: ");
printList(list);
return 0;
}
```
在这个例子中,我们通过三个指针prev、curr和nextTemp来实现节点的交换,同时prev初始化为NULL,curr初始指向头节点。每次循环,我们都让curr的下一个节点指向当前节点,然后更新curr和prev,直到遍历完整个链表。最后,头节点会变成原来的尾节点,完成了翻转。
阅读全文