基本思路:在链表添加一个头结点,指针m指向头结点,q指向head,p指向head->next,用一个循环跳过所有和q相等的节点
1、若存在多个和q相同的节点,则循环结束后p指针指向第一个和q不相等的节点,把m节点直接连接到p节点
2、若不存在和q相同的节点,则不作操作,所有指针向前移动一个位置
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (head == NULL || head->next == NULL)
return head;
ListNode *L = new ListNode(0);
L->next = head;
ListNode *p = head->next, *q = head,*m=L;
int flag = 0;
while (p != NULL){
while (p!=NULL&&q->val == p->val){
flag = 1;
p = p->next;
}
if (flag)
m->next = p;
if (p == NULL)
break;
q = p;
while (m->next != p)
m = m->next;
p = p->next;
flag = 0;
}
return L->next;
}
};