一、问题描述

二、解题思路
本题的思路比较明显,可以使用模拟的方法来解决这个问题。
(1)首先,遍历链表,记录极大值点和极小值点的下标,将其按顺序放入Index向量中;
(2)链表遍历完毕后检查Index向量:
<1>如果Index.size()<2,直接返回{-1,-1};
<2>否则,查找minDistance和maxDistance,再返回;
(3)maxDistance等于Index.back()-Index0,minDistance需要遍历Index向量,寻找相邻两个元素最小的差值(贪心)。**其实可以加一点小小的优化,如果minDistance已经为1了,那就不用再查找了。**最后返回{minDistance,maxDistance}即可。
三、代码实现
cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
vector<int> nodesBetweenCriticalPoints(ListNode* head) {
//记录每一个极值点的下标
vector<int> Index;
int index=0;
ListNode * cur=head->next;
ListNode * front=head;
ListNode * behind=nullptr;
while((cur!=nullptr)&&(cur->next!=nullptr)){
index++;behind=cur->next;
if(front->val>cur->val&&behind->val>cur->val) Index.push_back(index);
else if(front->val<cur->val&&behind->val<cur->val) Index.push_back(index);
front=cur;cur=cur->next;
}
//特殊情况处理
if(Index.size()<2) return {-1,-1};
//最大距离
int maxDistance=Index.back()-Index[0];
int minDistance=INT_MAX;
for(int i=0;i!=Index.size()-1;i++){
minDistance=min(minDistance,Index[i+1]-Index[i]);
}
return {minDistance,maxDistance};
}
};