帮我写一段(递归删除不带头结点单链表中指定值)的代码
时间: 2023-03-12 18:07:18 浏览: 101
void deleteNode(Node* head, int val) {
Node* p = head;
while (p != NULL && p->val != val) {
p = p->next;
} if (p == NULL) return; Node* tmp = p->next;
p->val = tmp->val;
p->next = tmp->next;
delete tmp;
}
相关问题
使用c语言完成对于不带头结点的非空单链表h,设计一个递归算对于不带头结点的非空单链表h,删除其中第一个值为x的结点
在C语言中,对于不带头结点的非空单链表H,递归地删除第一个值为`x`的节点可以按照以下步骤编写:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 递归删除节点的辅助函数
void delete_first_occurrence(Node** head_ref, int target) {
// 基本情况:如果链表为空,或者当前节点就是要删除的目标
if (*head_ref == NULL || **head_ref->next == target) {
Node* temp = *head_ref;
*head_ref = (*head_ref)->next;
free(temp); // 释放目标节点
return;
}
// 递归调用,继续查找下一个节点直到找到目标或遍历完链表
delete_first_occurrence(&(*head_ref)->next, target);
}
int main() {
// 示例链表的创建
Node* h = malloc(sizeof(Node));
h->data = 5;
h->next = malloc(sizeof(Node));
h->next->data = 7;
h->next->next = malloc(sizeof(Node));
h->next->next->data = 9;
h->next->next->next = NULL; // 假设需要删除的第一个节点值为5
// 删除第一个值为5的节点
delete_first_occurrence(&h, 5);
// 打印剩余链表
Node* current = h;
while (current != NULL) {
printf("%d -> ", current->data);
current = current->next;
}
printf("NULL\n");
return 0;
}
```
这段代码定义了链表节点结构体和一个递归函数`delete_first_occurrence`,该函数接受链表头部的指针作为输入,通过比较当前节点和目标值,以及递归地处理链表的其余部分,直至找到第一个匹配的节点并将其从链表中移除。
**相关问题--:**
1. 如果链表中的所有节点值都是`x`,这个函数会怎么处理?
2. 这个递归函数如何处理链表为空的情况?
3. 如果在删除节点的过程中发生内存分配失败,这段代码会有何反应?
对于不带头节点的单列表l,设计一个递归算法,逆序输出所有的结点值
要设计一个递归算法来逆序输出一个无头节点的单链表(也称为顺序表)中的所有元素,你需要定义一个辅助函数,该函数接收当前节点以及前一个节点作为参数。每次递归调用时,我们将当前节点的值输出,然后继续处理它的下一个节点,直到遍历到链表的末尾。
这里是一个简单的C++实现:
```cpp
#include <iostream>
// 定义链表节点结构体
struct Node {
int data; // 存储数据的字段
Node* next; // 指向下个节点的指针
};
// 辅助函数,用于递归逆序打印
void printReverse(Node* node, Node* prev = nullptr) {
if (node == nullptr) { // 基线条件:到达链表末尾
return;
} else {
// 递归调用,先输出当前节点,再处理下一个节点
std::cout << node->data << " "; // 输出当前节点值
printReverse(node->next, node); // 将prev指向当前节点,然后传入下一个节点
}
}
// 示例链表创建函数(为了演示)
Node* createLinkedList(int arr[], int size) {
Node* head = new Node();
Node* current = head;
for (int i = 0; i < size; ++i) {
current->data = arr[i];
current->next = new Node();
current = current->next;
}
return head;
}
int main() {
int arr[] = {1, 2, 3, 4, 5}; // 假设我们有一个这样的数组
int size = sizeof(arr) / sizeof(arr[0]);
Node* listHead = createLinkedList(arr, size);
std::cout << "Original list: ";
printReverse(listHead); // 正常打印链表
std::cout << "\nReversed list: ";
printReverse(listHead, nullptr); // 逆序打印链表
delete listHead; // 别忘了释放内存
return 0;
}
```
当你运行这段代码时,它首先按照正常顺序打印链表,然后调用`printReverse`函数并传入`nullptr`作为前一个节点,实现链表的逆序输出。
阅读全文