📅  最后修改于: 2023-12-03 14:56:19.654000             🧑  作者: Mango
该 C 程序用于删除指定位置的链表节点。链表是一种常用的数据结构,它可以动态地加入或者删除节点,因此十分适合于需要频繁进行增删操作的场景。这个程序可以帮助程序员在实际工作中快速删除链表中的任意节点。
该程序的主要思路是,先找到被删除节点的前一个节点,然后将它的 next 指针指向被删除节点的下一个节点,最后释放被删除节点的内存。
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
void deleteNode(struct ListNode *head, int position) {
struct ListNode *prev = head;
struct ListNode *cur = head->next;
// 如果要删除的是头结点
if (position == 0) {
head = head->next;
free(prev);
return;
}
// 找到被删除节点的前一个节点
for (int i = 0; i < position - 1; i++) {
prev = cur;
cur = cur->next;
}
// 将前一个节点的 next 指针指向被删除节点的下一个节点
prev->next = cur->next;
// 释放被删除节点的内存
free(cur);
}
int main() {
// 创建链表
struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *node1 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *node2 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *node3 = (struct ListNode *)malloc(sizeof(struct ListNode));
head->val = 0;
node1->val = 1;
node2->val = 2;
node3->val = 3;
head->next = node1;
node1->next = node2;
node2->next = node3;
node3->next = NULL;
// 删除第三个节点
deleteNode(head, 2);
// 打印链表
struct ListNode *cur = head;
while (cur != NULL) {
printf("%d ", cur->val);
cur = cur->next;
}
return 0;
}
0 1 3
该 C 程序可以帮助程序员删除链表中指定位置的节点。需要注意的是,当要删除的节点是头结点时,需要特殊处理。除此以外,这个程序适用于任何长度的链表和任何位置的删除操作。