题目要求
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路
链表如果是空,链表返回空。链表只有一个元素时,也不可能重复,直接返回就可以。如果为多个元素时,设置一个cur指针和cur的下一个结点的next指针,判断只两个值是否相等,如果不相等,两个指针都往后移动一步,直到cur为NULL,如果相等,我们将next指针后移,接着判断cur和next是否相等,直到找到和cur不相等的next指针,然后还需要记录cur的前驱结点,将cur的前驱结点到next之间的结点全部释放,注意,如果链表一上来就是相等的,需要修改头结点。重复上述操作,直到cur为NULL。
图解
代码实现
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if (pHead == NULL || pHead->next == NULL)
{
return pHead;
}
ListNode* cur = pHead;
ListNode* next = cur->next;
ListNode* prev = NULL;
while (next)
{
if (cur->val != next->val)
{
prev = cur;
cur = next;
next = next->next;
}
else
{
while (next && next->val == cur->val)
{
next = next->next;
}
//释放cur到next之间的重复的链表
while (cur != next)
{
struct ListNode* node = cur;
cur = cur->next;
free(node);
}
if (prev == NULL)
{
pHead = cur;
}
else
{
prev->next = cur;
}
}
if (cur)
{
next = cur->next;
}
}
return pHead;
}
};