📅  最后修改于: 2023-12-03 15:29:55.450000             🧑  作者: Mango
在实际应用中,需要经常操作链表,其中一项操作就是删除链表中的元素。本文介绍一种 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行左右,通过这个程序我们可以更好的理解链表的操作和指针的使用。希望读者通过本文,可以加深对链表和指针的理解。