题目描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
题解:
class Solution
{
public:
ListNode* deleteDuplication(ListNode* pHead)
{
ListNode* fakehead = new ListNode(INT_MAX);
fakehead->next = pHead;
ListNode* p = fakehead;
while(p && p->next)
{
if(p->next && p->val != p->next->val)
{
ListNode* q = p->next;
int cur = q->val;
int count = 0;
while(q && q->val == cur)
{
q=q->next;
++count;
}
if(count == 1)
p=p->next;
if(count > 1)
p->next=q;
}
}
ListNode *res = fakehead->next;
delete fakehead;
return res;
}
};
解题思路:
创造一个假头结点,用来应对开头就是重复结点的情况。
对每一个结点,检查其后边有多少个重复结点,如果就一个,也就是说,下一个结点不是重复结点,直接向下推进,如果是重复结点,就将重复的结点删除。检查是不是重复结点时通过计数实现的。