题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留。
样例
样例1
输入:1->2->3->3->4->4->5
输出:1->2->5
样例2
输入:1->1->1->2->3
输出:2->3
为了不特判head节点要被删除的情况,我们先建立一个虚拟头节点dummy,这样保证了头节点不会被删除。外层循环当p->next非空时继续,内层循环由q扫描p->next开始的节点,扫描到最后一个重复的数然后停下。如果此时p->next==q,说明这个数没有重复,p=q;继续循环,否则,说明这个数重复了,且此时q指向最后一个重复的该数的节点,要删除这些节点,直接令p->next=q->next。最后返回真实的头节点即dummy->next。以样例1为例图例如上。(画技过草):(
C++ 代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* head) {
auto dummy=new ListNode(-1);
dummy->next=head;
auto p=dummy;
while(p->next){
auto q=p->next;
while(q->next){
if(q->val==q->next->val) q=q->next;
else break;
}
if(q==p->next) p=q;
else p->next=q->next;
}
return dummy->next;
}
};