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

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

在链表操作中,有时需要删除链表中一些具有特定规律或特征的节点。例如,在一个单链表中,删除右侧具有较大值的节点,即删除链表中比当前节点大的所有节点。本文将介绍如何使用C++编写程序实现这一操作。

算法思路

本问题可以使用双指针法解决。定义两个指针,一个指向当前节点,一个指向下一个节点,比较当前节点与下一个节点的数值大小,如果下一个节点的值较大,那么删除该节点,否则保留该节点。继续这个过程,直到到达链表的末尾。

代码实现

首先,我们需要定义一个链表节点结构体,包含节点值和指向下一个节点的指针。

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

接下来,我们编写删除右侧较大值节点的函数。其中,使用了双指针法,依次比较当前节点与下一个节点的值大小,并删除右侧节点。

ListNode* deleteRightMax(ListNode* head) {
    if(head == NULL) return head;
    ListNode* dummy = new ListNode(0);
    dummy->next = head;
    ListNode* cur = head;
    ListNode* nxt = head->next;
    while(nxt != NULL) {
        if(nxt->val > cur->val) {
            cur->next = nxt->next;
            nxt = nxt->next;
            // 如果删除最后一个节点,则修改cur指针位置
            if(cur->next == NULL) cur = dummy;
        } else {
            cur = nxt;
            nxt = nxt->next;
        }
    }
    return dummy->next;
}

接下来,我们来测试一下这个函数。下面是一个例子:

int main() {
    ListNode* head = new ListNode(4);
    head->next = new ListNode(3);
    head->next->next = new ListNode(2);
    head->next->next->next = new ListNode(1);

    cout << "Before deleting right max nodes:" << endl;
    ListNode* p = head;
    while(p != NULL) {
        cout << p->val << " ";
        p = p->next;
    }
    cout << endl;

    ListNode* newHead = deleteRightMax(head);

    cout << "After deleting right max nodes:" << endl;
    ListNode* q = newHead;
    while(q != NULL) {
        cout << q->val << " ";
        q = q->next;
    }
    cout << endl;

    return 0;
}

输出结果如下:

Before deleting right max nodes:
4 3 2 1
After deleting right max nodes:
4 3 

可以看到,原链表中比4大的节点都被删掉了。

结论

通过双指针法,我们可以轻松地实现删除右侧较大值节点的函数。这个方法的时间复杂度为O(N),空间复杂度为O(1)。在链表操作中,这个方法是十分高效的,也是十分实用的。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 示例