题目大意:给出一个已排序了的链表,删除之中重复出现的元素,保证每个元素只出现一次。
算法思想:
1.设置两个指针,一个指向前驱节点,一个指向当前遍历的节点。
2.如果链表为空直接返回。遍历链表,比较前驱节点的元素和当前节点的元素是否相同,如果相同的则做标记,如果不相同则判断是否有标记,如果有则删除重复元素,如果没有标记则移动指针,继续遍历链表。
3.当链表遍历完后判断是否有标记存在,如果有则说明从前驱节点到链表末尾元素都相同,则删除相同元素。
4.返回修改过的链表。
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==NULL) return head;
ListNode *pre,*pnode;
pre=head;
pnode=head->next;
bool flag=false;
while(pnode!=NULL){
if(pre->val==pnode->val){
flag=true;
}
else{
if(flag){
ListNode* temp=pre->next;
pre->next=pnode;
delete temp;
flag=false;
}
pre=pnode;
}
pnode=pnode->next;
}
if(flag) {
ListNode* temp=pre->next;
pre->next=NULL;
delete temp;
}
return head;
}
};