如何使用C语言中的算法来就地逆置一个带头结点的单链表?
时间: 2024-10-24 14:05:22 浏览: 26
反转带头结点的链表(4种方法)
在C语言中,要就地逆置一个带头结点的单链表,可以采用类似于上面伪代码的方式。下面是具体的步骤:
首先,我们需要定义一些必要的结构体来表示链表节点和头结点:
```c
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
typedef struct List {
ListNode* head;
} List;
```
接着,编写函数`reverseList`来实现逆置操作:
```c
void reverseList(List* list) {
ListNode* prev = NULL; // 初始化前驱节点
ListNode* curr = list->head; // 初始化当前节点为头节点
// 遍历整个链表
while (curr != NULL) {
ListNode* nextTemp = curr->next; // 保存当前节点的下一个节点
curr->next = prev; // 将当前节点的next指向前一个节点
prev = curr; // 更新前驱节点
curr = nextTemp; // 移动到下一个节点
}
// 更新链表头
list->head = prev;
}
```
最后,你可以像这样调用`reverseList`函数:
```c
List yourList = { .head = malloc(sizeof(ListNode)) }; // 创建并初始化链表
// ... 添加节点到链表 ...
reverseList(&yourList); // 调用逆置函数
// ... 检查和使用逆置后的链表 ...
```
这个过程的时间复杂度是O(n),其中n是链表的长度,因为它只遍历了一次链表。
阅读全文