对给定的单链表 L ,设计一个算法,删除 L 中值为 x 的结点的直接前驱结点。C语言
时间: 2023-10-30 21:08:57 浏览: 102
struct ListNode {
int val;
struct ListNode *next;
};
void deletePreNode(struct ListNode *head, int x) {
struct ListNode *p = head;
while (p->next != NULL) {
if (p->next->val == x) {
struct ListNode *pre = p->next;
p->next = pre->next;
free(pre);
return;
}
p = p->next;
}
}
相关问题
对给定的单链表 L ,设计一个算法,删除 L 中值为 x 的结点的直接前驱结点的c语言代码
以下是删除 L 中值为 x 的结点的直接前驱结点的 C 语言代码:
```c
struct ListNode* deletePredecessor(struct ListNode* head, int x) {
struct ListNode* curr = head;
struct ListNode* prev = NULL;
while (curr != NULL) {
if (curr->next != NULL && curr->next->val == x) {
if (prev == NULL) {
head = curr->next;
} else {
prev->next = curr->next;
}
free(curr);
break;
}
prev = curr;
curr = curr->next;
}
return head;
}
```
对给定的单链表 L ,设计一个算法,删除 L 中值为 x 的结点的直接前驱结点。(C语言)
在C语言中,如果我们要删除单链表中值为x的节点的直接前驱节点,首先需要确保链表不是空的,并且目标节点的值确实存在。可以按照以下步骤编写算法:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新节点
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode != NULL) {
newNode->data = value;
newNode->next = NULL;
}
return newNode;
}
// 删除值为x的节点的直接前驱节点
void deletePredecessor(Node** head, int x) {
if (*head == NULL || (*head)->data != x) {
// 如果头节点为空或者头节点不是目标值,直接返回
return;
}
// 找到目标节点(x的直接后继)
Node* current = *head;
while (current->next != NULL && current->next->data != x) {
current = current->next;
}
// 如果没找到目标节点,说明不存在该值
if (current->next == NULL) {
printf("Value %d not found in the list.\n", x);
return;
}
// 更新目标节点的前一个节点的next指针,使其跳过目标节点
current->next = current->next->next;
}
// 打印链表
void printList(Node* head) {
Node* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
// 初始化链表示例
Node* head = createNode(1);
head->next = createNode(2);
head->next->next = createNode(3);
head->next->next->next = createNode(x); // 替换为你要查找并删除的x
printf("Original List:\n");
printList(head);
deletePredecessor(&head, x); // 删除x的直接前驱
printf("\nList after deletion:\n");
printList(head);
return 0;
}
```
这个函数会在`main`中删除值为`x`的节点的直接前驱,然后打印出删除后的链表。记得替换`createNode(x)`中的`x`为实际需要查找和删除的值。
阅读全文