题解 | #删除链表峰值#

删除链表峰值

https://www.nowcoder.com/practice/30a06e4e4aa549198d85deef1bab6d25

题意分析:

农场主人有一群牛,每只牛都有一个编号,形成了一个链表。现在需要删除链表中比前后结点值都大的牛的编号(即删除那些在链表中比前后结点都大的节点)。需要注意的是,首尾的牛的编号不能删除。

时间复杂度:

分析代码中的时间复杂度。假设链表中有N个节点。

  1. 在代码中,首先检查了链表是否为空或只有一个节点,这需要O(1)的时间。
  2. 然后遍历链表,删除满足条件的节点。在最坏情况下,我们可能需要遍历整个链表一次,这需要O(N)的时间。
  3. 因此,总的时间复杂度为O(N)。

代码分析:

代码中的解决思路是利用两个指针prevcurr分别表示当前节点和下一个节点,遍历链表,找到满足条件的节点并进行删除操作。具体的步骤如下:

  1. 如果链表为空或者只有一个节点,直接返回头节点。
  2. 初始化两个指针prevcurr,分别指向头节点和第二个节点。
  3. 开始遍历链表: a. 如果prev节点的值小于curr节点的值,并且curr节点的值大于curr->next节点的值,则说明curr节点的值比前后节点都大,应该删除该节点。 b. 删除节点的操作是将prev->next指向curr->next,同时更新curr节点为curr->next,继续下一轮的遍历。 c. 如果curr节点的值不满足上述条件,说明该节点保留,将prev指针移动到currcurr指针移动到curr->next,继续下一轮的遍历。
  4. 最后返回头节点。

代码:

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

class Solution {
public:
    ListNode* deleteNodes(ListNode* head) {
        if (!head || !head->next) return head;
        ListNode* prev = head;
        ListNode* curr = head->next;
        while (curr->next) {
            if (prev->val < curr->val && curr->val > curr->next->val) {
                prev->next = curr->next;
                curr = curr->next;
            } else {
                prev = curr;
                curr = curr->next;
            }
        }
        return head;
    }
};

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-07 13:35
虽然不怎么光彩,经过这件事,可能我真的要去认同“面试八股文早该淘汰!不会用AI作弊的程序员=新时代文盲!”这句话了
HellowordX:Ai的出现是解放劳动力的,不是用来破坏公平竞争环境的,这样下去,轻则取消所有线上面试,严重了会影响整个行业对所有人产生影响,企业会拉高入职考核各种离谱考核会层出不穷
你找工作的时候用AI吗?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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