题解 | #删除有序链表中重复的元素-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; } };