1 删除链表峰值

描述
设计一个算法,删除链表中比前后节点的编号都大的节点。链表的第一个和最后一个节点不需要删除。
示例1
输入:
{1,3,2,4,5}
输出:
{1,2,4,5}
示例2

输入:
{5,4,3,2,1}
输出:
{5,4,3,2,1}
备注:
链表长度在 [0, 10000] 之间。
每个节点的值范围是 0 < Node.val <= 10000。

#include <iostream>
#include <vector>

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

// 创建链表的辅助函数
ListNode* createLinkedList(const std::vector<int>& values) {
    if (values.empty()) return nullptr;
    ListNode* head = new ListNode(values[0]);
    ListNode* current = head;
    for (size_t i = 1; i < values.size(); ++i) {
        current->next = new ListNode(values[i]);
        current = current->next;
    }
    return head;
}

// 打印链表的辅助函数
void printLinkedList(ListNode* head) {
    ListNode* current = head;
    while (current != nullptr) {
        std::cout << current->val << " ";
        current = current->next;
    }
    std::cout << std::endl;
}

class Solution
{
public:
    // 删除节点函数
    // 输入:链表头节点指针 head
    // 输出:删除符合条件节点后的链表头节点指针
    ListNode *deleteNodes(ListNode *head)
    {
        // 保存原链表头节点指针 a
        ListNode *a = head;

        // 当链表中至少存在三个节点时进行处理
        while (head != nullptr && head->next != nullptr && head->next->next != nullptr)
        {
            // 判断当前节点的下一个节点的值是否大于当前节点和下下个节点的值
            if (head->next->val > head->val && head->next->val > head->next->next->val)
            {
                // 如果满足条件,删除当前节点的下一个节点
                head->next = head->next->next;
            }
            // 否则,继续遍历下一个节点
            head = head->next;
        }
        // 返回修改后的链表头节点指针
        return a;
    }
};

int main() {
    // 解决方案类实例化
    Solution solution;

    // 创建第一个链表
    std::vector<int> list1_values = {1, 3, 2, 4, 5};
    ListNode* list1 = createLinkedList(list1_values);
    std::cout << "第一个链表: ";
    printLinkedList(list1);
    ListNode* modifiedList1 = solution.deleteNodes(list1);
    std::cout << "第一个链表修改后: ";
    printLinkedList(modifiedList1);

    // 创建第二个链表
    std::vector<int> list2_values = {5, 4, 3, 2, 1};
    ListNode* list2 = createLinkedList(list2_values);
    std::cout << "第二个链表: ";
    printLinkedList(list2);
    ListNode* modifiedList2 = solution.deleteNodes(list2);
    std::cout << "第二个链表修改后: ";
    printLinkedList(modifiedList2);

    return 0;
}

函数功能原理

deleteNodes 函数用于从链表中删除某些节点,这些节点的值比其前一个节点和后一个节点的值都要大。这个操作可以看作是在链表中删除局部的“峰值”节点。

具体步骤如下:

  1. 初始化:保存原链表头节点的指针 a,以便最后返回修改后的链表头节点。
  2. 遍历链表:使用 while 循环遍历链表,条件是链表中至少存在三个节点。
  3. 判断条件:在每个节点上,判断当前节点的下一个节点的值 head->next->val 是否大于当前节点的值 head->val,且大于下下个节点的值 head->next->next->val
  4. 删除节点:如果上述条件成立,意味着 head->next 是一个“峰值”节点,删除该节点,即将当前节点的 next 指针指向下下个节点 head->next->next
  5. 继续遍历:如果条件不成立或删除操作后,移动当前节点指针 head 指向下一个节点,继续判断。

这样,当循环结束时,所有符合条件的“峰值”节点都被删除,函数返回修改后的链表头节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值