思路:设置快慢指针,两个指针位置相差一,然后比较两个指针所指向的节点内的值,如果相同则删除q所指向的节点,然后p,q移动;如果不相同,那么直接p,q移动即可。
转化:用赋值代替删除。
当p和q所指向节点的值不相同时,先让p后移一位,然后将q的值赋值给p指向的节点,然后q向后移动一位。
当p和q所指向节点的值相同时,q向后移动,一直找到与p不同的节点为止。
最后p->next = NULL,因为此时p后面的节点都是与p相同的。
总结:让p指针来保证链表中元素不重复
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* deleteDuplicates(struct ListNode* head) {
struct ListNode *p,*q;
p = head;
if(p == NULL || p -> next == NULL){
return head;
}
q = head -> next;
while(q != NULL){
if(p->val != q->val){
p = p -> next;
p->val = q -> val;
q=q->next;
}else{
q=q->next;
}
}
p->next = NULL;
return head;
}