📌  相关文章
📜  C ++程序删除右侧具有更大价值的节点(1)

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

C++程序删除右侧具有更大价值的节点

简介

本文介绍了一种用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++编写的算法,用于删除链表中右侧具有更大价值的节点。该算法在遍历链表的过程中,维护两个变量:右侧节点中的最大值和链表中上一个节点。如果当前节点的值小于右侧最大值,就将该节点从链表中删除。如果大于右侧最大值,就将该节点作为新的最大值,继续遍历。