#include<iostream> #include<cstring> using namespace std; class node { public: int data; node*next; node(int value):data(value),next(NULL){} void print() { cout<<data; } }; class list { node*head; public: list():head(nullptr){} void creatlist1() { int value; cin>>value; while(value) { node*newnode=new node(value); if(!head) { head=newnode; } else { node*temp=head; while(temp->next!=NULL) { temp=temp->next; } temp->next=newnode; } } } void creatlist2() { creatlist1(); } void showlist() { node* temp = head; while (temp) { cout<<temp->data<<" "; temp = temp->next; } cout << endl; } void deletelist() { node* prev = NULL; node* current = head; node* next = NULL; while (current) { next = current->next; current->next = prev; prev = current; current = next; } head = prev; } }; int main() { int n; while(1) { cin>>n; if(n==0)break; if(n==1){list l1;l1.creatlist1();l1.showlist();l1.deletelist();} if(n==2){list l2;l2.creatlist2();l2.showlist();l2.deletelist();} } }这段代码有问题,帮我修改这段代码
时间: 2025-06-25 09:25:26 浏览: 9
### 修正后的 C++ 链表操作代码
以下是经过优化和完善的 C++ 程序,涵盖了链表的创建、显示以及反转功能。此版本基于提供的引用内容进行了改进,并确保逻辑清晰且易于理解。
#### 完整代码实现
```cpp
#include <iostream>
using namespace std;
// 定义链表节点结构体
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {} // 构造函数初始化节点值和指针
};
// 创建链表函数
ListNode* createList(const vector<int>& values) {
if (values.empty()) return nullptr; // 如果输入数组为空,则返回空指针
ListNode* head = new ListNode(values[0]); // 初始化头节点
ListNode* current = head;
for (size_t i = 1; i < values.size(); ++i) { // 循环构建后续节点
current->next = new ListNode(values[i]);
current = current->next;
}
return head; // 返回链表头节点
}
// 显示链表内容函数
void printList(ListNode* head) {
ListNode* current = head;
while (current != nullptr) { // 遍历整个链表并打印每个节点的值
cout << current->val;
if (current->next != nullptr) cout << " -> ";
current = current->next;
}
cout << endl;
}
// 反转链表函数
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr; // 前驱节点初始为nullptr
ListNode* curr = head; // 当前节点从头节点开始
while (curr != nullptr) { // 遍历链表直到当前节点为空
ListNode* nextTemp = curr->next; // 保存下一个节点
curr->next = prev; // 修改当前节点指向其前驱节点
prev = curr; // 更新prev到当前节点位置
curr = nextTemp; // 移动到下一节点继续处理
}
return prev; // 最终prev成为新链表的头节点
}
int main() {
vector<int> nums = {1, 2, 3, 4, 5}; // 输入数据用于构造链表
ListNode* originalHead = createList(nums); // 调用createList函数创建原始链表
cout << "Original List: ";
printList(originalHead); // 打印原链表内容
ListNode* reversedHead = reverseList(originalHead); // 调用reverseList函数反转链表
cout << "Reversed List: ";
printList(reversedHead); // 打印反转后的链表内容
return 0;
}
```
---
### 关键点解析
1. **链表创建**
使用 `vector` 提供的数据来动态生成链表节点[^2]。通过循环逐一连接各节点,最终形成完整的单向链表。
2. **链表遍历与显示**
实现了通用的 `printList` 函数,能够按顺序访问链表中的每一个节点并将它们的值输出至控制台[^1]。
3. **链表反转算法**
运用了经典的三指针方法完成链表反转操作。时间复杂度为 O(n),空间复杂度为 O(1)[^2]。具体过程如下:
- 设置三个指针变量:`prev`, `curr`, 和临时存储器 `nextTemp`。
- 不断更新这些指针的位置关系直至到达链表末端。
- 最后返回新的头节点 `prev`。
4. **边界条件处理**
对于特殊情况(如空链表),程序会直接返回 `nullptr`,从而避免潜在错误。
---
###
阅读全文
相关推荐
















