题解 | 删除链表中重复的结点
删除链表中重复的结点
https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if(pHead==nullptr) return nullptr; ListNode* pre = new ListNode(0); pre->next = pHead; ListNode* cur = pHead; while(cur&&cur->next){ if(cur->next->val==cur->val){ ListNode* toDelete = cur; int val = cur->val; while(toDelete&&toDelete->val==val){ pre->next = toDelete->next; if(toDelete==pHead) pHead = pre->next; delete toDelete; toDelete = pre->next; } cur = toDelete; } else{ pre = cur; cur = cur->next; } } return pHead; } };
如果重复了,本身也要删除,那就涉及会不会把第一个节点删没了的情况,所以在删除时要判断,并根据结论更新第一个节点。
删除结束有两种可能,如果是删除完了,那么就不能访问下一位了,那么我们就需要直接退出循环,或者为循环加一个判断条件。
&&只要前一半是错的就不会访问后一半了,所以我选择了直接加在while的条件中而不是让它break。