用栈逆置一个单链表C
时间: 2024-10-17 22:04:11 浏览: 29
在C语言中,利用栈来逆置一个单链表是一种常见的算法技巧。通常我们不直接操作链表节点,而是通过辅助结构(例如栈)来进行操作。以下是基本步骤:
1. **初始化栈**:创建一个空栈,并将头节点压入栈中。
2. **遍历链表**:当栈非空时,继续弹出栈顶元素并更新当前节点指针。然后将当前节点的下一个节点压入栈中,直到链表遍历完。
3. **构建新的链表**:当栈为空时,表示已经处理完原链表的所有节点。此时,栈顶的节点就是新的头节点,因为我们在遍历时一直在后进先出(LIFO)的方式添加节点。
4. **返回新头节点**:返回栈顶节点作为逆置后的链表的新头节点。
这里需要注意的是,由于没有内置的数据结构库提供堆栈功能,需要手动实现一个栈,比如使用数组或动态内存分配。
```c
struct ListNode {
int val;
struct ListNode *next;
};
void reverseList(struct ListNode **head) {
if (*head == NULL || (*head)->next == NULL) return; // 如果链表为空或只有一个节点,无需反转
struct ListNode* current = *head;
struct ListNode* prev = NULL;
struct ListNode stack[100]; // 假设栈的最大容量为100
int top = -1;
while (current != NULL) {
stack[++top] = *current;
prev = current;
current = current->next;
}
current = stack[top];
while (top >= 0) {
prev->next = current;
prev = current;
current = stack[--top];
}
prev->next = NULL; // 结束
*head = current; // 新的头节点
}
```
阅读全文