题解 | 删除链表中重复的结点
删除链表中重复的结点
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。