主要的思路:创建一个虚拟头结点,目的就是为了找到前驱节点。在移动的过程中如果满足,当前节点的值不等于前驱节点的值,并且不等于后驱节点的值(后驱节点可能为空,为空的情况是满足条件的)。就报该点保留下来。
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @return ListNode类
*/
ListNode* deleteDuplicates(ListNode* head) {
ListNode* dummyHead = (ListNode*)malloc(sizeof(ListNode));
dummyHead->val = 1001;
dummyHead->next = head;
ListNode* pre = dummyHead, *cur = head, *dummy = dummyHead;
while (cur != NULL) {
if (pre->val != cur->val) {
if (cur->next == NULL || cur->next->val != cur->val) {
dummy->next = cur;
dummy = cur;
}
}
pre = cur;
cur = cur->next;
}
dummy->next = NULL;
return dummyHead->next;
}
};