1.题目
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5
处理后为1->2->5
;
2.我的题解
- 首先要明确,重复的结点是一个也不保留的,不是去重复而保留一个;
- 分重复和不重复两种情况讨论;
- 原头结点可能被删除,这样不好搞,可以用一个额外的头结点;
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if(!pHead)return pHead;
ListNode head(0);head.next=pHead;
ListNode * cur=&head,*next=cur->next;
while(next){
if(next->next &&next->next->val==next->val){//有重复
ListNode * p=next;
while(p && p->val==next->val)p=p->next;
cur->next=p;
next=p;
}
else{//无重复
cur=next;
next=next->next;
}
}
return head.next;
}
};
3.别人的题解
4.总结与反思
(1)额外头结点的运用;