C语言 逆置单链表。 对于不带头结点的单链表h,设计一个递归算法逆置所有结点
时间: 2024-09-24 11:22:54 浏览: 53
在C语言中,逆置单链表是指将链表的节点顺序反转,即原来的头节点变成尾节点,依次类推。对于不带头结点的单链表,我们可以利用递归的方式实现这个操作,这里提供一个简单的递归算法思路:
1. **基础情况**:当链表只有一个节点时,不需要进行任何操作,因为单个节点本身就是它的逆序版本,所以返回原链表本身即可。
2. **递归过程**:
- 定义一个辅助函数,名为`reverse_list_recursively`,接受两个参数:当前节点`node`和前一个节点`prev`(初始时`prev`设为空指针)。当`node`不为空时,执行以下操作:
a. 保存当前节点的下一个节点,记作`next_node`。
b. 更新当前节点的指向,使其指向前一个节点`prev`。
c. 递归调用自身,传入`next_node`和当前节点`node`作为新的参数。
- 最终返回头节点`node`,也就是新的逆向链表的头。
以下是递归算法的C语言代码实现:
```c
struct ListNode* reverse_list_recursively(struct ListNode* node, struct ListNode* prev) {
if (node == NULL) { // 基础情况:空链表或只有一个节点
return prev;
}
// 保存下一个节点
struct ListNode *next_node = node->next;
// 反转当前节点
node->next = prev; // 更新当前节点指向
prev = node; // 更新前一个节点
// 递归调用
return reverse_list_recursively(next_node, prev);
}
// 主函数调用
void reverseList(struct ListNode* h) {
h = reverse_list_recursively(h, NULL); // 初始化prev为NULL,递归入口
}
```
阅读全文