题解 | #删除有序链表中重复的元素-II#

删除有序链表中重复的元素-II

https://www.nowcoder.com/practice/71cef9f8b5564579bf7ed93fbe0b2024

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 *  ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @return ListNode类
     */
    ListNode* deleteDuplicates(ListNode* head) {
        // write code here
        return ptrMethod(head);
    }
    /*
    1、res保存整个链表,用于返回;left指向重复数值的前一个数,pre第一个重复的数,cur当前指针
    left->pre->cur
    2、cur不为空的时候,循环判断
    1)如果出现重复的数,删掉cur的值,left和pre不动
    2)如果没有出现重复的数,并且isdouble是true,删掉pre指针,pre和cur指针都往后移
    3)如果没有出现重复的数,所有指针都往后移
    3、如果重复标志为1,则要删掉pre指针
    */
    ListNode* ptrMethod(ListNode* head) {
        if (head == nullptr || head->next == nullptr) {
            return head;
        }
        auto res = new ListNode(-1);
        ListNode* left = res;
        left->next = head;
        ListNode* pre = head;
        ListNode* cur = head->next;
        bool isdouble = false;
        while (cur) {
            if (pre->val == cur->val) {//如果出现重复的数,删掉cur的值,left和pre不动
                isdouble = true;
                pre->next = cur->next;
            } else if (isdouble) {//如果没有出现重复的数,并且isdouble是true,删掉pre指针,pre和cur指针都往后移
                left->next = cur;
                pre = cur;
                isdouble = false;
            } else {//如果没有出现重复的数,所有指针都往后移
                left = left->next;
                pre = pre->next;
                isdouble = false;
            }
            cur = cur->next;
            // display(head);
        }
        //删掉最后一个重复的数
        if (isdouble) {
            left->next = nullptr;
        }
        return res->next;
    }
    void display(ListNode* head) {
        while (head) {
            cout << head->val << ",";
            head = head->next;
        }
        cout << endl;
    }
};

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-30 11:34
真的很糟糕:黑奴听了都流泪啊
点赞 评论 收藏
分享
07-09 20:50
门头沟学院 Java
码农索隆:1.教育背景和荣誉证书合二为一。 2.获奖项目理一遍,你做了什么,对你求职的岗位有什么帮助,没有就删掉。 3.技能特长和教育背景交换位置。 4.技能特长写的太差,上网上找简历参考。都不用问你别的,一个redis就能把你问住,写写你具体会redis哪些方面的知识。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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