编写算法实现带头结点单链表的就地逆置,即利用原带头结点单链表的结点空间把元素序列 a0,a1, ……,an-1)逆置为 an-1 ,……, a1, a0。用c语言
时间: 2024-12-02 16:28:48 浏览: 6
在C语言中,可以使用迭代的方式实现带头节点单链表的就地逆置(即不需要额外的空间)。下面是使用递归栈实现的一种方法:
```c
// 定义链表结构
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
// 就地逆置链表函数
void reverseList(ListNode* head) {
if (head == NULL || head->next == NULL) { // 特殊情况:空链表或只有一个元素
return;
}
// 创建辅助头节点
ListNode newHead = *head;
ListNode* prev = NULL;
// 使用快慢指针找到链表中间节点
ListNode* slow = head;
ListNode* fast = head->next;
while (fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
}
// 反转剩余部分
prev = slow->next;
slow->next = NULL;
reverseList(prev);
// 连接反转后的链表和剩余部分
newHead.next = prev;
}
// 测试用法
int main() {
// 初始化链表
ListNode* head = malloc(sizeof(ListNode));
head->data = 1;
head->next = malloc(sizeof(ListNode));
head->next->data = 2;
// ...继续添加更多元素...
// 逆置链表
reverseList(head);
// 打印逆置后的链表
ListNode* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
return 0;
}
```
注意:这个解决方案假设了链表的内存已经足够存放新链表,如果链表过长,可能会导致堆栈溢出。实际应用中,应避免使用递归,并考虑其他方法,如迭代。
阅读全文