📅  最后修改于: 2023-12-03 15:00:13.030000             🧑  作者: Mango
本文介绍了如何使用C程序删除链表中的M个节点,并返回删除后的链表中的N个节点。
首先,我们需要定义链表的结构。链表由一个或多个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。
// 定义链表节点结构
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
// 定义链表结构
typedef struct LinkedList {
ListNode* head;
int length;
} LinkedList;
此处我们使用了一个头指针head来指向链表的第一个节点,length表示链表的长度。
下面是删除链表的M个节点后的N个节点的C函数实现。
// 删除链表的M个节点后的N个节点
ListNode* deleteMAfterN(LinkedList* list, int M, int N) {
if (list == NULL || list->head == NULL)
return NULL;
// 找到要删除的第一个节点的前一个节点
ListNode* prev = list->head;
for (int i = 0; i < M - 1 && prev != NULL; i++) {
prev = prev->next;
}
// 如果没有足够的节点要删除,则直接返回链表
if (prev == NULL || prev->next == NULL)
return list->head;
// 删除节点
ListNode* current = prev->next;
for (int i = 0; i < N && current != NULL; i++) {
ListNode* temp = current;
current = current->next;
free(temp);
}
// 更新指针
prev->next = current;
// 更新链表长度
list->length -= N;
return list->head;
}
在这个函数中,我们首先遍历链表找到要删除的第一个节点的前一个节点prev。然后根据参数M和N,删除M个节点后的N个节点,并释放相应的内存。最后,更新指针和链表的长度。
以下是如何使用上述函数的示例代码:
int main() {
LinkedList list;
list.head = (ListNode*) malloc(sizeof(ListNode));
list.head->data = 1;
list.head->next = NULL;
list.length = 1;
// 在链表末尾添加节点
ListNode* current = list.head;
for (int i = 2; i <= 10; i++) {
ListNode* newNode = (ListNode*) malloc(sizeof(ListNode));
newNode->data = i;
newNode->next = NULL;
current->next = newNode;
current = current->next;
list.length++;
}
// 删除链表的3个节点后的2个节点
ListNode* newHead = deleteMAfterN(&list, 3, 2);
// 输出删除后的链表
current = newHead;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
// 释放内存
current = newHead;
while (current != NULL) {
ListNode* temp = current;
current = current->next;
free(temp);
}
return 0;
}
在该示例中,我们首先创建了一个包含10个节点的链表。然后,我们调用deleteMAfterN函数删除链表的3个节点后的2个节点,并输出删除后的链表。最后,释放链表的内存。
本文介绍了如何使用C程序删除链表中的M个节点,并返回删除后的链表中的N个节点。通过使用链表的数据结构和指针操作,我们可以轻松实现这个功能。以上示例代码仅供参考,你可以根据实际需求进行修改和扩展。