问题描述:
给定一个排序链表,删除所有重复的元素每个元素只留下一个。
样例:给出1->1->2->NULL;返回1->2->NULL。
实现思路:
先考虑链表为空时的特殊情况;再考虑一般情况:定义两个指针变量p和q,初始时,P指向链表中的第一个元素,q指向链表中的第二个元素。如果p和q的值相等时,就删除q指针指向的节点。如果p和q的值不相等,则分别向后移一个节点。
代码:
ListNode *deleteDuplicates(ListNode *head) {
if (head == NULL) {
return head;
}
ListNode *p, *q;
p = head;
q = head->next;
while (q != NULL) {
if ( p->val == q->val ) {
p->next = q->next;
q = q->next;
} else {
p = q;
q = q->next;
}
}
return head;
}
感想:
一开始只定义了一个指针变量,当重复的元素超过两个时就无法删除所有的重复元素只留下一个。定义两个指针变量,先固定一个指针P,另一个指针向后移动,直到删除所有与P指向的节点有相同值的节点。然后p和q再分别向后移动一个节点。