对给定的单链表 L ,设计一个算法,删除 L 中值为 x 的结点的直接前驱结点。C描述完整程序
时间: 2023-10-30 14:08:49 浏览: 118
对给定的链表 L ,设计一个算法,删除 L 中值为 x 的结点的直接前驱结点。删除结点.cpp
```
#include <stdio.h>
#include <stdlib.h>
// 定义链表结点
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 创建链表
ListNode* createList(int arr[], int n) {
ListNode *head = NULL;
ListNode *tail = NULL;
for (int i = 0; i < n; i++) {
ListNode *node = (ListNode*)malloc(sizeof(ListNode));
node->val = arr[i];
node->next = NULL;
if (tail == NULL) {
head = tail = node;
} else {
tail->next = node;
tail = node;
}
}
return head;
}
// 删除结点的直接前驱结点
void deletePredecessor(ListNode *head, int x) {
ListNode *p = head;
while (p != NULL && p->next != NULL) {
if (p->next->val == x) {
ListNode *pre = p;
ListNode *cur = p->next;
pre->next = cur->next;
free(cur);
return;
}
p = p->next;
}
}
// 打印链表
void printList(ListNode *head) {
while (head != NULL) {
printf("%d ", head->val);
head = head->next;
}
printf("\n");
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(int);
ListNode *head = createList(arr, n);
printf("原链表:");
printList(head);
deletePredecessor(head, 4);
printf("删除结点的直接前驱结点后的链表:");
printList(head);
return 0;
}
```
阅读全文