free(p)意思就是把变量p的空间释放了,就是释放节点的意思
断开节点那段代码是说哪个代码咧
free(p) 是释放一个结点,上面代码里,这句之前已经 L = L->next;再释放就没有问题了。
容易犯错的地方:
思考为何不先增表长,再后移再插入x
对于删除不带头结点的单链表中所有值为x的结点的递归算法,可以参考以下步骤:
步骤1: 定义一个递归函数deleteNode
,输入参数为指向当前节点的指针和要删除的值x。
步骤2: 如果当前节点为空,则递归结束。如果当前节点的值等于x,则释放当前节点的内存,并将当前节点指针指向下一个节点。
步骤3: 递归调用deleteNode
函数,将当前节点的下一个节点作为输入参数继续进行删除操作。
步骤4: 返回删除操作完成后的链表。
以下是一个可能的实现:
#include <iostream>
struct Node {
int data;
Node* next;
};
void deleteNode(Node* node, int x) {
if (node == nullptr) {
return;
}
if (node->data == x) {
Node* temp = node;
node = node->next;
delete temp;
deleteNode(node, x);
} else {
deleteNode(node->next, x);
}
}
void printList(Node* node) {
while (node != nullptr) {
std::cout << node->data << " ";
node = node->next;
}
std::cout << std::endl;
}
int main() {
Node* node1 = new Node();
Node* node2 = new Node();
Node* node3 = new Node();
Node* node4 = new Node();
Node* node5 = new Node();
node1->data = 1;
node2->data = 2;
node3->data = 3;
node4->data = 2;
node5->data = 5;
node1->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = node5;
node5->next = nullptr;
printList(node1);
deleteNode(node1, 2);
printList(node1);
return 0;
}
输出结果:
1 2 3 2 5
1 3 5
以上代码中,我们首先定义了一个递归函数deleteNode
,它接受一个指向当前节点的指针以及要删除的值x。在函数中,我们首先判断当前节点是否为空,如果为空则递归结束。然后判断当前节点的值是否等于x,如果是,则释放当前节点的内存,并将当前节点指针指向下一个节点。接着递归调用deleteNode
函数,将当前节点的下一个节点作为参数继续进行删除操作。最后,我们可以通过调用printList
函数来打印删除操作完成后的链表。
希望这个解决方案对你有所帮助!如果你还有任何问题,请随时提问。