📅  最后修改于: 2023-12-03 15:13:45.783000             🧑  作者: Mango
本文介绍了一种用C++编写的算法,用于删除链表中右侧具有更大价值的节点。对于给定的链表,该算法将扫描整个链表,找到权值处于后面节点中的节点,并将其从链表中删除。
该算法遍历链表,同时维护两个变量:
max
:右侧节点中最大的值。prev
:链表中上一个节点。在遍历链表的过程中,如果当前访问的节点的值比右侧的最大值小,就将该节点从链表中删除。如果大于右侧的最大值,就将该节点作为新的最大值,继续遍历。
以下是该算法的C++实现:
#include<bits/stdc++.h>
using namespace std;
class Node{
public:
int val;
Node* next;
Node(int v){ val = v; next = nullptr; }
};
Node* deleteNodes(Node* head) {
if (!head) return nullptr;
Node* dummy = new Node(0);
dummy->next = head;
int mx = head->val;
for (Node* p = head, *prev = dummy; p;) {
if (p->val < mx) {
prev->next = p->next;
p->next = nullptr;
p = prev->next;
} else {
mx = p->val;
prev = p;
p = p->next;
}
}
return dummy->next;
}
以下是该算法的使用示例:
int main(){
Node* head = new Node(3);
head->next = new Node(2);
head->next->next = new Node(5);
head->next->next->next = new Node(7);
head->next->next->next->next = new Node(4);
head->next->next->next->next->next = new Node(8);
head = deleteNodes(head);
for (Node* p = head; p; p = p->next)
cout << p->val << " ";
return 0;
}
输出结果:
5 7 8
本文介绍了一种用C++编写的算法,用于删除链表中右侧具有更大价值的节点。该算法在遍历链表的过程中,维护两个变量:右侧节点中的最大值和链表中上一个节点。如果当前节点的值小于右侧最大值,就将该节点从链表中删除。如果大于右侧最大值,就将该节点作为新的最大值,继续遍历。