📜  C程序删除链表的M个节点后的N个节点(1)

📅  最后修改于: 2023-12-03 15:00:13.030000             🧑  作者: Mango

删除链表的M个节点后的N个节点

本文介绍了如何使用C程序删除链表中的M个节点,并返回删除后的链表中的N个节点。

链表数据结构

首先,我们需要定义链表的结构。链表由一个或多个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

// 定义链表节点结构
typedef struct ListNode {
    int data;
    struct ListNode* next;
} ListNode;

// 定义链表结构
typedef struct LinkedList {
    ListNode* head;
    int length;
} LinkedList;

此处我们使用了一个头指针head来指向链表的第一个节点,length表示链表的长度。

删除M个节点后的N个节点

下面是删除链表的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个节点。通过使用链表的数据结构和指针操作,我们可以轻松实现这个功能。以上示例代码仅供参考,你可以根据实际需求进行修改和扩展。