C++ 链表删除节点代码错误分析:空链表判断和指针移动
这段代码实现了一个从链表中删除节点的功能,其中两个容易出现错误的地方是:
- 空链表判断: 当链表为空时,
p指向head会导致程序崩溃。需要在循环开始前判断链表是否为空。 - 指针移动: 在删除节点后,
p应该指向被删除节点的下一个节点,但代码中直接p = p->next会跳过一个节点。正确的写法应该是p = p->next->next。
错误的代码如下:
void run() {
Node* p = head; //指向头节点的指针
while (p->next != p) { //当只剩一个节点时结束循环
for (int i = 1; i < m - 1; i++) { //找到要删除的节点的前一个节点
p = p->next;
}
cout << p->next->data << ' '; //输出要删除的节点的数据
Node* temp = p->next; //将要删除的节点保存到临时指针中
p->next = temp->next; //将要删除的节点从链表中删除
delete temp; //释放内存
p = p->next->next; //指向下一个节点
}
cout << p->data << endl; //输出最后剩下的节点的数据
}
修改后的代码:
void run() {
if (head == nullptr) {
return; // 空链表直接返回
}
Node* p = head;
while (p->next != p) {
for (int i = 1; i < m - 1; i++) {
p = p->next;
}
cout << p->next->data << ' ';
Node* temp = p->next;
p->next = temp->next;
delete temp;
p = p->next; // 指向下一个节点
}
cout << p->data << endl;
}
原文地址: https://www.cveoy.top/t/topic/mT4U 著作权归作者所有。请勿转载和采集!