原地反转链表节点,C语言实现
时间: 2024-10-10 17:06:16 浏览: 40
原地反转链表是指在不额外分配新空间的情况下,改变链表节点自身的指针,使得链表从头开始到尾顺序翻转。以下是C语言的一个简单递归实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 反转链表的辅助函数
ListNode* reverseHelper(ListNode* head, ListNode* prev) {
if (!head || !head->next) {
// 如果链表为空或只有一个节点,则直接返回当前节点
return head;
}
// 递归反转剩余部分,然后将当前节点连接到prev节点之后
ListNode* curr = head->next;
head->next = prev; // 将当前节点的next指向前一个节点
prev = head; // 更新prev指向当前节点
head = curr; // 遍历到下一个节点
// 继续递归处理
return reverseHelper(curr, prev);
}
// 主函数用于创建链表并进行反转
void reverseList(ListNode** head_ref) {
ListNode* newHead = reverseHelper(*head_ref, NULL); // 初始化prev为NULL
*head_ref = newHead; // 更新原始链表头
}
// 创建链表示例
void createList(ListNode** head_ref, int arr[], int size) {
ListNode* temp = *head_ref = (ListNode*)malloc(sizeof(ListNode));
temp->val = arr[0];
temp->next = NULL;
for (int i = 1; i < size; i++) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = arr[i];
newNode->next = temp->next;
temp->next = newNode;
}
}
// 打印链表
void printList(ListNode* node) {
while (node) {
printf("%d -> ", node->val);
node = node->next;
}
printf("NULL\n");
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int size = sizeof(arr) / sizeof(arr[0]);
ListNode* head = NULL;
createList(&head, arr, size);
printf("Original list:\n");
printList(head);
reverseList(&head);
printf("\nReversed list:\n");
printList(head);
return 0;
}
```
在这个例子中,`reverseList`函数会修改传入的链表头指针,使其指向新的头节点,实现了原地反转。
阅读全文