提示:牛客网来说是不告诉你那里错了的,所以自己需要考虑到三种种情况
①首先按照正常的来写,写完以后在代码上修改添加需要补充的没有想到的条件
正常情况(相同的两个节点都在中间位置)
一般情况下,如果没有通过测试用例大部分没有考虑周到,对于这种单链表来说,在头和尾非常容易出现错误。
头(一开始就有相同的结点)
尾(尾部有相同的两个节点)
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if(pHead == NULL || pHead->next == NULL)
return pHead;
ListNode* prev = NULL;
ListNode* cur = pHead;
ListNode* next = cur->next;
while(next)
{
//先考虑正常的写法
if(cur->val != next->val)
{
//三个指针同时往后走
prev = cur;
cur = next;
next = next->next;
}
else
{
//尾不正常的情况也要考虑进去
while(next && cur->val == next->val)
{
next = next->next;
}
//这里是考虑了头那里就是相同的情况
if(prev !=NULL)
{
prev->next = next;
}
else
{
//此时前面的结点都删除了,所以现在的这个next就是新的头
pHead = next;
}
//释放那两个相同的结点
while(cur != next)
{
//如果你直接对cur释放完,他就找不到下一个了
ListNode* del = cur;
cur = cur->next;
free(del);
}
if(next != NULL)
next = cur->next;
}
}
return pHead;
}
};