描述
设计一个算法,删除链表中比前后节点的编号都大的节点。链表的第一个和最后一个节点不需要删除。
示例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 函数用于从链表中删除某些节点,这些节点的值比其前一个节点和后一个节点的值都要大。这个操作可以看作是在链表中删除局部的“峰值”节点。
具体步骤如下:
- 初始化:保存原链表头节点的指针
a,以便最后返回修改后的链表头节点。 - 遍历链表:使用
while循环遍历链表,条件是链表中至少存在三个节点。 - 判断条件:在每个节点上,判断当前节点的下一个节点的值
head->next->val是否大于当前节点的值head->val,且大于下下个节点的值head->next->next->val。 - 删除节点:如果上述条件成立,意味着
head->next是一个“峰值”节点,删除该节点,即将当前节点的next指针指向下下个节点head->next->next。 - 继续遍历:如果条件不成立或删除操作后,移动当前节点指针
head指向下一个节点,继续判断。
这样,当循环结束时,所有符合条件的“峰值”节点都被删除,函数返回修改后的链表头节点。
828

被折叠的 条评论
为什么被折叠?



