题解 | #删除有序链表中重复的元素-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; } };#牛客创作赏金赛#
牛客网刷题记录 文章被收录于专栏
本人认为值得记录的一些题