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

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

https://www.nowcoder.com/practice/71cef9f8b5564579bf7ed93fbe0b2024?tpId=295&tags=&title=&difficulty=0&judgeStatus=0&rp=0&sourceUrl=%2Fexam%2Foj

// 使用三个指针 prepre pre p
// 初始化让prepre为空,pre=head,p=head->next
// 然后定义一个int型的flag用来表示最近一次比较是否有结点相等
// 依次遍历p 如果p == pre 则删除p结点,并且让flag=1 表示如果不同时需要删除pre
// 如果p!=pre 则判断flag的值 
// 为1 ,则删除pre指针 这里需要判断pre是否为head结点,如果是则更新head结点 删除完成令flag为0
// 为0 则往后遍历,并更新prepre的值
// 最后遍历结束,判断flag是否为1 
// 若为1 进行最后一次删除,如果head=pre,说明这个链表的所有值相等,直接返回nullptr即可
// 如果head!=pre 则必有prepre!=nullptr,删除pre即可

    ListNode* deleteDuplicates(ListNode* head) {
        // write code hereh
        if (head == nullptr)
            return nullptr;
        if (head->next == nullptr)
            return head;
        ListNode* pre = head, *p = head->next;
        ListNode* prepre=nullptr;
        int flag = 0;
        while (p) {
            if (pre->val == p->val) 
			{ // 删除p
                flag = 1;
                pre->next = p->next;
                delete p;
                p = pre->next;
            } 
		  else {
                if (flag == 1) 
				{ // 删除pre
                    if (pre == head) 
					{
                        delete pre;
                        head = p;
                        pre = p;
                        p = p->next;
                    } 
				  else 
					{
                        prepre->next = pre->next;
                        delete pre;
                        pre = prepre->next;
                        p = pre->next;
                    }
                    flag = 0;
                } 
                else 
                {
                    prepre= pre;
                    p = p->next;
                    pre = pre->next;
                }
            }
        }
        if (flag == 1) {
            if (pre == head) {
                delete pre;
                head = nullptr;
            } 
            else {
                prepre->next = pre->next;
                delete pre; 
            }
        }
        return head;
    }
};

#牛客创作赏金赛#
牛客网刷题记录 文章被收录于专栏

本人认为值得记录的一些题

全部评论

相关推荐

野猪不是猪🐗:我assume that你must技术aspect是solid的,temperament也挺good的,however面试不太serious,generally会feel style上不够sharp
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务