七、删除链表中重复的结点 – 牛客网
描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
分析:
这道题可以借鉴之前删除指定值结点题目。 我们需要三个指针prev,cur,next。
根据我画图上内容。
1、cur、next指针负责判断是否出现重复结点。 而且先删除next重复结点, 因为还可能存在重复, 因此cur先不删除, 当不出现重复时,删除cur重复结点。
2、prev结点用于连接, 它的更新只会存在当没有重复结点时, prev、cur、next三指针偏移。
源码:
ListNode* deleteDuplication(ListNode* pHead)
{
if(!pHead) {
return nullptr;
}
//定义三指针prev,cur,next
ListNode* prev = nullptr;
ListNode* cur = pHead;
ListNode* next = pHead->next;
while(next) {
if(cur->val == next->val) {
//出现重复结点
while(cur->val == next->val) {
//采用while循环删除
ListNode* tmp = next->next; //保存next下一个结点
if(!prev) {
//prev为nullptr,代表重复结点出现根节点, 删除后需要更新根节点。
pHead = tmp;
}
else {
//重复结点不在根节点
prev->next = tmp;
}
delete next; //删除next结点
next = tmp; //更新next
if(!next) {
//next为空,代表链表到头
break; //退出
}
}
delete cur; //最终删除cur结点
cur = next; //更新cur
if(next) //更新next
next = next->next;
}
else {
//没有出现重复结点
prev = cur; //更新prev
cur = next; //更新cur
next = next->next; //更新nex