题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
解题思路
遍历链表,如果发现当前结点的值和下一结点的值相同,即为重复,则将重复的值记录下来,并从该位置开始选择删除,直到遇到不重复的值为止
需要注意两点:
- 上一不重复的结点(应记录下来)的
next
指针应该指向下一不重复的结点 - 如果头结点被删除了,需要更换头结点
C++代码实现
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead){
if(!pHead)return NULL;
ListNode *ptr;
ptr=pHead;
bool can=false;
ListNode *pre=NULL;
while(ptr!=NULL){
if(ptr->next&&ptr->val==ptr->next->val)can=true;
if(can){
ListNode *de=ptr;
int val=de->val;
while(de!=NULL&&val==de->val){
ptr=ptr->next;
delete de;
de=ptr;
}
if(pre==NULL)pHead=ptr;
else
pre->next=ptr;
can=false;
}else{
pre=ptr;
ptr=ptr->next;
}
}
return pHead;
}
};
运行时间:3ms
占用内存:376k