题解 | #删除链表峰值#
删除链表峰值
https://www.nowcoder.com/practice/30a06e4e4aa549198d85deef1bab6d25?tpId=354&tqId=10595857&ru=/exam/company&qru=/ta/interview-202-top/question-ranking&sourceUrl=%2Fexam%2Fcompany
/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @return ListNode类 */ struct ListNode* deleteNodes(struct ListNode* head ) { // write code here struct ListNode* pre = head,*cur = pre->next; while(cur->next) { if((cur->val > pre->val)&&(cur->val > cur->next->val)) { pre->next = cur ->next; } else { pre = pre->next; } cur = cur->next; } return head; }
1.考察的知识点:单链表
2.编程语言:C
3.解题思路 : 以1 3 2 4 5 为例子
分析题目可知左右边界峰值忽略不计,因此只需要考虑其他位置 3 2 4;
head指针指向链表头元素1;
定义pre、cur两个指针,分别表示当前指针的前一个位置、当前指针位置;
将pre指针指向当前head的位置,*pre = head;另一个指向pre的下一个位置;即在初始状态下pre指向1,cur指向3
然后分别向后顺序遍历,
当cur指针指到4时,此时cur->next 判断为true,
cur指针接着后移,到达右边界,此时cur->next不存在,得出循环边界为cur->next存在。
每次只需要考虑当前cur的值与pre、cur->next的值的大小,若cur的值比左边的pre和右边的cur->next更大,则执行pre->next = cur ->next,删除cur节点,更新cur节点;否则pre前移,更新cur节点。
#面试高频TOP202##2023-8-3学习1#