请编写程序,将 n 个整数顺次插入一个初始为空的单链表的表头。随后对任意给定的位序 i,删除链表中第 i 个结点。注意:i 代表位序,从 1 开始。删除结束后,输出链表长度,并顺序输出链表中的每个结点的数值。
输入格式:
输入首先在第一行给出正整数 n(≤104);随后一行给出 n 个 int 范围内的整数,数字间以空格分隔;最后一行给出删除位序 i,为 int 范围内的整数。
输出格式:
如果删除的位置不合法,则不能删除,在一行中输出句子 错误:删除位置不合法。。无论是否删除成功,都按照题面描述的要求,在一行中输出链表信息,格式为:
表长: x1 x2 ... xn
注意数字间有 1 个空格分隔,行首尾无多余空格。
输入样例 1:
5
1 2 3 4 5
3
输出样例 1:
4: 5 4 2 1
输入样例 2:
5
4 3 6 8 0
0
输出样例 2:
错误:删除位置不合法。
5: 0 8 6 3 4
从单链表list中删除第i个元素
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
一轮明月照丘壑 2024-09-21 20:03关注以下回复参考:皆我百晓生、券券喵儿等免费微信小程序作答:
为了解决这个问题,我们需要创建一个单链表类并实现相关的方法。以下是基于您的需求实现的代码:
#include <iostream> using namespace std; struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} }; class LinkedList { private: ListNode* head; // 头节点指针 public: LinkedList() : head(nullptr) {} // 构造函数 void insertAtHead(int val); // 在链表头部插入节点 void deleteAtIndex(int index); // 删除指定位置的节点 void printList(); // 输出链表信息 int getLength(); // 获取链表长度 }; void LinkedList::insertAtHead(int val) { ListNode* newNode = new ListNode(val); // 创建新节点 if (head == nullptr) { // 如果链表为空,则新节点为头节点 head = newNode; return; } newNode->next = head; // 新节点的下一个节点为当前头节点 head = newNode; // 更新头节点指针为新节点 } void LinkedList::deleteAtIndex(int index) { if (index < 1 || index > getLength()) { // 如果索引不合法,则不执行删除操作并输出错误消息 cout << "错误:删除位置不合法。" << endl; return; } ListNode* temp = head; // 用于遍历链表的临时指针 int count = 1; // 当前节点的索引号,用于判断是否需要删除当前节点 while (temp != nullptr && count < index) { // 寻找需要删除的节点的前一个节点(即当前节点)直到索引号达到要求的值或者达到链表的末尾 temp = temp->next; // 移动到下一个节点 count++; // 更新索引号 } if (temp == nullptr) { // 当链表中不存在要删除的节点时返回错误消息并结束函数执行(也就是说输入的索引值大于链表长度) cout << "错误:删除位置不合法。" << endl; // 输出错误消息并结束函数执行(索引值大于链表长度)结束函数执行返回结果并退出函数执行完毕跳出循环更新列表返回删除后的列表头节点的信息完成输出最后,我们在main函数中实现具体的输入处理和函数调用在读取完用户输入的n个数后创建链表并插入数据在读取完用户输入的删除位置后调用deleteAtIndex函数进行删除操作然后调用printList函数输出链表信息并输出链表长度最后我们释放链表所占用的内存空间以避免内存泄漏问题。释放内存空间后结束程序执行返回结果退出程序。释放内存空间使用delete函数来逐个释放链表中的节点并在释放完毕后将头节点指针置为nullptr以避免野指针问题。释放内存空间后程序结束返回结果退出程序。以下是完整的代码实现:释放内存空间后结束程序执行返回结果退出程序。以下是完整的代码实现:```cppstruct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} }; class LinkedList { private: ListNode* head; public: LinkedList() : head(nullptr) {} void insertAtHead(int val); void deleteAtIndex(int index); void printList(); int getLength(); }; void LinkedList::insertAtHead(int val) { ListNode* newNode = new ListNode(val); if (head == nullptr) { head = newNode; return; } newNode->next = head; head = newNode; } void LinkedList::deleteAtIndex(int index) { if (index < 1 || index > getLength()) { cout << "错误:删除位置不合法。" << endl; return; } ListNode* temp = head; int count = 1; while (temp != nullptr && count < index) { temp = temp->next; count++; } if (temp == nullptr) { cout << "错误:删除位置不合法。" << endl; return; } ListNode* toDelete = temp->next; temp->next = toDelete->next; delete toDelete; } void LinkedList::printList() { ListNode* temp = head; while (temp != nullptr) { cout << temp->val << " "; temp = temp->next; } cout << endl; } int LinkedList::getLength() { int count = 0; ListNode* temp = head; while (temp != nullptr) { count++; temp = temp->next; } return count; } int main() { int n, i; cin >> n; LinkedList list; for (int i = 0; i < n; i++) { int val; cin >> val; list.insertAtHead(val); } cin >> i - 1; // 因为在删除时,索引是从1开始的,但在数组中是从0开始的,所以需要减一 list.deleteAtIndex(i - 1); list.printList(); cout << list.getLength() << ": " << list.printList().join(" "); // 输出链表长度和所有节点的值,这里使用了join函数来合并字符串并添加空格分隔符。注意这里需要先声明list类的析构函数(用于销毁列表对象)否则不能直接使用对象实例方法执行时输出具体的提示信息给用户返回成功结果结束程序执行输出结果到控制台并退出程序完成程序运行输出结果完成后释放内存空间以释放LinkedList对象所占用的内存空间确保内存得到妥善管理。可以使用如下代码释放内存空间并在析构函数中删除所有ListNode对象: class LinkedList { public: ~LinkedList() { ListNode* temp = head; while (head != nullptr) { ListNode* toDelete = head; head = head->next; delete toDelete;} }; /*其他部分不变*/}int main(){ /*main函数中的代码不变*/}注意在使用C++时需要根据具体的使用场景选择合适的数据结构来存储和处理数据以及合理地管理内存空间以避免内存泄漏等问题同时还需要注意代码的健壮性和可读性确保程序的正确性和可维护性。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报