请编程实现带头结点的单链表逆序问题( 要求空间复杂度为O(1) ) 例如:输入单链表中元素序列为a1, a2,…an, 则返回单链表中元素 序列为an, an-1,…a1, 。使用c++
时间: 2024-09-16 09:04:45 浏览: 62
算法实现:Java单链表逆序
在C++中,实现一个空间复杂度为O(1)的单链表逆序操作可以利用迭代的方式,不需要额外的空间来存储新的节点。以下是使用迭代的方法:
```cpp
#include <iostream>
// 定义链表节点结构体
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
// 逆序链表函数
ListNode* reverseList(ListNode* head) {
if (head == nullptr || head->next == nullptr) { // 如果链表为空或只有一个节点,直接返回
return head;
}
ListNode *prev = nullptr; // 初始化前驱指针为NULL
ListNode *curr = head; // 当前指针初始化为头节点
ListNode *temp = nullptr; // 中间临时指针
while (curr != nullptr) { // 遍历整个链表
temp = curr->next; // 将当前节点的下一个节点暂存
curr->next = prev; // 更新当前节点的next指向前驱
prev = curr; // 前驱指针前进一位
curr = temp; // 当前指针前进到暂存的节点
}
return prev; // 返回反转后的头节点
}
// 打印链表
void printList(ListNode* head) {
ListNode* curr = head;
while (curr != nullptr) {
std::cout << curr->val << " ";
curr = curr->next;
}
std::cout << "\n";
}
int main() {
// 创建示例链表
ListNode* list = new ListNode(1);
list->next = new ListNode(2);
list->next->next = new ListNode(3);
list->next->next->next = new ListNode(4);
std::cout << "Original List: ";
printList(list);
list = reverseList(list); // 逆序链表
std::cout << "Reversed List: ";
printList(list);
return 0;
}
```
这段代码首先检查链表是否为空或只有一个节点,然后使用三个指针(`prev`, `curr`, 和 `temp`)来逐个反转链表中的节点。最后,`main` 函数中创建了一个简单的链表并打印了原顺序和逆序后的结果。
阅读全文