题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路来自网上:https://blog.youkuaiyun.com/u010429424/article/details/77967245
设置 三个指针,pre,h,post。分两种情况考虑:
当 h->val != post->val 的时候,三个指针均向后移动;
当 h->val == post->val 的时候,不断向后移动post,直到 不等,
此时,pre不动,将其next设为post。h,post 和第一种情况类似,向后移动。
注意,如果pre扔处在头节点的前一位置,那么,要将头结点 设为 post。因为最后返回的是 头结点。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
ListNode* pre = new ListNode(0);
ListNode* h = pHead;
ListNode* post = nullptr;
pre->next = h;
post= h->next;
while(h!=nullptr && post!=nullptr)
{
if (h->val != post->val)
{
pre = h;
}
else
{
while (post!=nullptr && h->val == post->val)
{
post = post->next;
}
if (pre->next == pHead)
{
pHead = post;
}
pre->next = post;
}
h = post;
post =post->next;
}
return pHead;
}
};