题解 | #删除链表中重复的结点#
删除链表中重复的结点
http://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef
基本思想是遍历链表,当下一个结点的值与本结点相同时,继续查看下一个结点,直到找到一个结点与本结点的值不同,将上一结点的next域指向不同的结点,从而完成将重复结点从链表中去除的需求。
需要注意的是,当列表头结点重复时需要特殊处理。一半的代码都是头结点的特殊处理,有能力的朋友可以尝试优化代码结构。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead) {
ListNode* p = pHead;
ListNode* pre= pHead;
ListNode* result = pHead;
while(p){
ListNode* tod = p;
bool isRe = false;
while(tod->next && tod->next->val == p->val){
isRe = true;
tod = tod->next;
}
if(isRe){
if(p == pHead || pre == nullptr || p == pre){
pre = tod->next;
result = tod->next;
}
else{
pre->next = tod->next;
}
isRe = false;
p = tod->next;
}
else{
pre = p;
p = p->next;
}
}
return result;
}
};