单链表的原地逆置c
时间: 2025-04-22 11:50:41 浏览: 22
单链表的原地逆置是一种常见的数据结构操作,它可以在常数空间复杂度的情况下将链表反转。下面是详细步骤以及C语言实现:
### 步骤说明
假设我们有一个单链表 `1 -> 2 -> 3 -> 4 -> NULL`,我们要将其变为 `4 -> 3 -> 2 -> 1 -> NULL`。
#### 主要思想:
遍历整个链表,并逐个节点修改指针的方向,使得每个节点都指向它的前驱结点,直到所有节点都被处理完。
#### 具体过程包括以下几个部分:
- **初始化**三个指针变量:prev、current 和 next
- 遍历链表时更新这三个指针的位置
- 最终返回新的头结点(即原来的尾结点)
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 创建新节点辅助函数
ListNode* createNode(int value) {
ListNode *new_node = (ListNode *)malloc(sizeof(ListNode));
new_node->val = value;
new_node->next = NULL;
return new_node;
}
// 打印链表辅助函数
void printList(ListNode *head) {
while(head != NULL){
printf("%d ", head->val);
head = head->next;
}
printf("\n");
}
/// @brief 原地逆转单向链表并返回新的头部引用
/// @param head 待转换的原始链表头部位置
/// @return 反转后的链表的新头部地址
ListNode* reverseLinkedListInPlace(ListNode *head)
{
// 如果列表为空或是只有一个元素,则直接返回该头部即可。
if (!head || !head->next) {
return head;
}
ListNode *prev = NULL, *curr = head ,*nextTemp ;
while(curr!=NULL){
nextTemp= curr->next ; //保存当前节点下一个节点信息
curr->next = prev; // 修改当前节点的后继为之前的节点
prev = curr; // 将当前节点作为“之前”的节点
curr = nextTemp; // 移动到下一节点继续循环判断是否需要翻转其他剩余链接
}
return prev ;
}
```
此段程序展示了如何通过迭代的方式对给定的一个简单整型值构成的单链表实现了就地倒序排列的功能。需要注意的是,在实际应用中还需要考虑内存管理和错误检查等问题。
阅读全文
相关推荐


















