设计一算法,对单链表实现就地逆置。线性表(a1,a2,..an)逆置为(an,an-1,..a1)(就地含义辅助空间O(1))用C语言
时间: 2024-11-18 18:16:59 浏览: 5
The-reverse-of-sqlist.rar_就地逆置
为了在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 *current = *head; // 当前指针初始化为头节点
ListNode *temp; // 中间临时指针
// 遍历整个链表
while (current != NULL) {
temp = current->next; // 保存当前节点的下一个节点
current->next = prev; // 更新当前节点指向前驱
prev = current; // 前驱指针向前移动一步
current = temp; // 当前指针移到下一个位置
}
*head = prev; // 最后,将原头节点变成新的头节点
}
// 打印链表
void printList(ListNode *node) {
while (node != NULL) {
printf("%d -> ", node->val);
node = node->next;
}
printf("NULL\n");
}
int main() {
// 创建示例链表:1 -> 2 -> 3 -> 4 -> 5
ListNode *head = (ListNode *)malloc(sizeof(ListNode));
head->val = 1;
head->next = (ListNode *)malloc(sizeof(ListNode));
head->next->val = 2;
head->next->next = (ListNode *)malloc(sizeof(ListNode));
head->next->next->val = 3;
head->next->next->next = (ListNode *)malloc(sizeof(ListNode));
head->next->next->next->val = 4;
head->next->next->next->next = (ListNode *)malloc(sizeof(ListNode));
head->next->next->next->next->val = 5;
head->next->next->next->next->next = NULL;
printf("Original List:\n");
printList(head);
reverseList(&head); // 反转链表
printf("\nReversed List:\n");
printList(head);
return 0;
}
```
当你运行这个程序时,它会先打印原始链表,然后显示反转后的链表。注意,这里的`reverseList`函数接受的是指向头节点的指针的指针,以便在函数内部修改链表。
阅读全文