在单向链表中删除所有的偶数元素结点。
时间: 2023-04-01 20:03:03 浏览: 238
可以使用遍历单向链表的方式,对每个结点进行判断,如果该结点的值为偶数,则删除该结点。具体实现可以使用双指针,一个指向当前结点,一个指向前一个结点,当需要删除当前结点时,将前一个结点的 next 指向当前结点的 next,然后将当前结点删除即可。
相关问题
试编写算法,按照输入数据建立带头结点的单向链表,在单向链表中删除所有的偶数元素结点,并输出删除后的新的单链表。
要实现这个算法,可以按照以下步骤编写:
1. 定义一个链表节点结构体,包含整数值 `val` 和指向下一个节点的指针 `next`。
```cpp
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
```
2. 创建一个函数 `removeEvenNumbers`,接受一个链表头节点作为参数。
```cpp
ListNode* removeEvenNumbers(ListNode* head) {
// 如果链表为空或者只有一个元素,直接返回
if (head == NULL || head->next == NULL) {
return head;
}
ListNode* current = head;
ListNode* prev = NULL;
while (current != NULL) {
// 检查当前节点是否为偶数
if (current->val % 2 == 0) {
// 如果是偶数,更新前一个节点的next指向前一个节点
if (prev != NULL) {
prev->next = current->next;
} else { // 如果是头节点,需要特殊处理
head = current->next;
}
// 释放当前节点
delete current;
} else {
// 非偶数节点,继续遍历
prev = current;
current = current->next;
}
}
return head;
}
```
3. 调用函数并打印结果(假设有一个 `main` 函数用于测试)
```cpp
int main() {
// 初始化链表示例...
ListNode* list = ...;
list = removeEvenNumbers(list);
// 输出删除偶数元素后的链表
printLinkedList(list); // 自定义函数,将链表打印出来
return 0;
}
```
用c语言编写一个主函数,调试上述算法。随机产生或键盘输入一组元素,建立一个带头结点的单向链表 遍历单向链表。 在单向链表中删除所有的偶数元素结点。 编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利 用该函数建立一个非递减有序单向链表。
在C语言中,首先我们需要定义链表结构,包含节点的数据域和指向下一个节点的指针。接下来,我们可以按照以下步骤编写相应的函数:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h> // 需要用到时间库生成随机数
// 定义链表节点结构
typedef struct Node {
int data;
struct Node* next;
} Node;
// 初始化链表头节点
Node* createList() {
Node* head = (Node*)malloc(sizeof(Node));
if (!head) {
printf("Memory allocation failed.\n");
return NULL;
}
head->data = 0; // 或者随机生成第一个元素
head->next = NULL;
return head;
}
// 打印链表
void printList(Node* head) {
Node* current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
// 删除偶数节点
Node* deleteEvenNodes(Node* head) {
Node* current = head;
Node* prev = NULL;
while (current != NULL) {
if (current->data % 2 == 0) {
if (prev != NULL) {
prev->next = current->next;
} else {
head = current->next;
}
free(current); // 释放内存
current = current->next;
} else {
prev = current;
current = current->next;
}
}
return head;
}
// 插入保持非递减顺序的函数
Node* insertSorted(Node* head, int value) {
if (head == NULL || value <= head->data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = head;
head = newNode;
return head;
}
Node* current = head;
while (current->next != NULL && current->next->data > value) {
current = current->next;
}
if (current->next != NULL) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = current->next;
current->next = newNode;
} else {
newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->next = NULL;
current->next = newNode;
}
return head;
}
int main() {
srand(time(0)); // 设置随机数种子
Node* list = createList();
// 随机生成或输入元素(这里仅示例随机生成)
for (int i = 0; i < 10; ++i) {
list = insertSorted(list, rand() % 50); // 随机值在0-49之间
}
printList(list);
list = deleteEvenNodes(list);
printList(list);
free(head); // 清理不再需要的链表
return 0;
}
```
阅读全文