题目大意:给定一个排序的链表,要求删除所有重复的元素
题目分析:使用三个指针pPre,pNode,pLast。pPre指向当前需要判断的元素,pNode指向当前元素的后一个元素,如果pPre与pNode的值相等,那么将pNode后移,直到它们不相等,然后将pPre指向出现不相等的第一个元素。pLast指向的是在当前位置之前,已删除重复元素的链表的末位元素,也就是说,pLast指向的是最后一个不重复的元素。
代码展示:
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==NULL)
return head;
ListNode* pNode = head->next;
ListNode* pPre = head;
ListNode* pLast = NULL;
if(pNode==NULL)
return head;
while(pNode!=NULL){
if(pNode->val==pPre->val){
if(pNode->next==NULL){
if(pLast==NULL)
return NULL;
pLast->next = NULL;
return head;
}
while(pNode->next->val==pPre->val){
pNode = pNode->next;
if(pNode->next==NULL){
if(pLast==NULL)
return NULL;
pLast->next = NULL;
return head;
}
}
if(pLast==NULL){
head = pNode->next;
}
else
pLast->next = pNode->next;
pPre = pNode->next;
pNode = pPre->next;
}
else{
pLast = pPre;
pPre = pPre->next;
pNode = pNode->next;
}
}
return head;
}
};
对于链表的题目,代码写出来之后要特别注意边界测试,即测试一下特殊的用例。比如说本题,要测试[1],[1,1,1],[1,1,2,2],[1,2,2,2,3,3,4]等等。