题目描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留。
样例1
输入:1->2->3->3->4->4->5
输出:1->2->5
样例2
输入:1->1->1->2->3
输出:2->3
分析:
本题与一般去重不同之处是:对于重复的元素,一个不留。于是很可能删除后,链表为空。为了防止头结点被删,我们需要定义一个虚拟头结点指向head(其实定义一个头指针即可)。之后,依靠指针不断的比较,我采用的是三指针,当然也可以削减为双指针。遇见重复的就删掉,接上链,否则,指针右移即可。
注意:只要指针右移了,而且要访问其val或者next,则使用前必须判空,否则会造成段错误。
/**
* 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) {
if(head == NULL) return head;
ListNode* vhead = new ListNode(-1);//虚拟头结点
vhead->next = head;
ListNode* p = vhead;
ListNode* t = head;
ListNode* q = head->next;
while(q != NULL){
while(q != NULL && q->val != t->val){
p = t;
t = q;
q = q->next;
}
if(q == NULL) break;
while(q != NULL && q->val == t->val){
q = q->next;
}
p->next = q;
t = q;
if(q != NULL) q = q->next;
}
return vhead->next;
}
};