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

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

C++程序删除链表的M个节点后的N个节点

在实际应用中,需要经常操作链表,其中一项操作就是删除链表中的元素。本文介绍一种 C++ 程序来删除链表中的 M 个节点后的 N 个节点。

程序需求

给定一个链表的头节点head、一个正整数M和一个正整数N,删除该链表中从第 M 个节点开始的 N 个节点。如果链表的长度小于或者等于 M,则整个链表都应该被删除。程序需要返回删除节点操作后的链表的头节点。

程序实现

本程序的核心思想是通过迭代扫描我们的单向链表,并在遍历列表时删除一定数量的节点。我们使用如下伪代码来解决问题:

//伪代码

// get the length of the linked list
len = get_list_length(head);

// if the remove range of nodes is larger than the length of the list, just return NULL
if (m < len) {
    // create a dummy node to reference the head node
    dummy = new ListNode(0);
    dummy->next = head;

    // point to the start and end node of the remove range
    prev = dummy;
    curr = head;
    for(int i = 1; i < m; ++i) {
        prev = curr;
        curr = curr->next;
    }
    for(int i = 0; i < n; ++i) {
        curr = curr->next;
    }
    prev->next = curr;
    return dummy->next;
}
else {
    return NULL;
}
代码实现

下面是完整的 C++ 代码,运行效率非常高,时间复杂度为 $O(n)$:

#include <iostream>

using namespace std;

class ListNode {
public:
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(NULL) {}
};

ListNode* removeNthFromEnd(ListNode* head, int n) {
    ListNode* dummy = new ListNode(0);
    dummy->next = head;

    ListNode* p1 = dummy;
    ListNode* p2 = dummy;

    for(int i = 0; i < n; ++i) {
        p1 = p1->next;
    }

    while(p1->next != NULL) {
        p1 = p1->next;
        p2 = p2->next;
    }

    ListNode* tmp = p2->next;
    p2->next = p2->next->next;
    delete tmp;

    return dummy->next;
}

int main()
{
    ListNode* head = new ListNode(1);
    ListNode* p1 = new ListNode(2);
    ListNode* p2 = new ListNode(3);
    ListNode* p3 = new ListNode(4);
    ListNode* p4 = new ListNode(5);
    head->next = p1;
    p1->next = p2;
    p2->next = p3;
    p3->next = p4;
    p4->next = NULL;

    int m = 3;
    int n = 2;

    ListNode* result = removeNthFromEnd(head, n);

    while(result != NULL) {
        cout << result->val << endl;
        result = result->next;
    }

    return 0;
}
结束语

以上就介绍了如何在C++中实现删除链表的M个节点后的N个节点,核心代码只有10行左右,通过这个程序我们可以更好的理解链表的操作和指针的使用。希望读者通过本文,可以加深对链表和指针的理解。