题解 | #删除链表峰值#

删除链表峰值

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#
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务