这段代码实现了一个从链表中删除节点的功能,其中两个容易出现错误的地方是:

  1. 空链表判断: 当链表为空时,p 指向 head 会导致程序崩溃。需要在循环开始前判断链表是否为空。
  2. 指针移动: 在删除节点后,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;
}
C++ 链表删除节点代码错误分析:空链表判断和指针移动

原文地址: https://www.cveoy.top/t/topic/mT4U 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录