C语言写一算法,对单链表实现就地逆置
时间: 2024-09-25 09:05:13 浏览: 34
单链表就地逆置的方法
在C语言中,我们可以使用迭代的方式来实现单链表的就地逆置。这种方法不需要额外的空间,并直接修改原链表的节点指针。以下是简单的步骤:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 就地逆置链表函数
ListNode* reverseList(ListNode* head) {
ListNode* prev = NULL; // 初始化前驱节点为空
ListNode* curr = head; // 当前节点初始指向头结点
while (curr != NULL) { // 当前节点不为空时
ListNode* nextTemp = curr->next; // 保存当前节点的下一个节点
curr->next = prev; // 将当前节点的next指向前驱节点
prev = curr; // 更新前驱节点为当前节点
curr = nextTemp; // 移动到下一个节点
}
return prev; // 返回新的头结点(原尾部)
}
int main() {
// 创建并初始化链表示例
ListNode* list = malloc(sizeof(ListNode));
list->val = 1;
list->next = malloc(sizeof(ListNode));
list->next->val = 2;
list->next->next = malloc(sizeof(ListNode));
list->next->next->val = 3;
list->next->next->next = NULL;
printf("Original List: ");
printList(list);
list = reverseList(list); // 反转链表
printf("\nReversed List: ");
printList(list);
free(list);
return 0;
}
// 辅助函数:打印链表
void printList(ListNode* node) {
while (node != NULL) {
printf("%d -> ", node->val);
node = node->next;
}
printf("NULL\n");
}
阅读全文