题解 | #删除链表中重复的结点#
删除链表中重复的结点
https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ //记得:加表头的模式 class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if(pHead==nullptr||pHead->next==nullptr){ return pHead; } ListNode * head=(ListNode *)malloc(sizeof(ListNode)); head->next=pHead; ListNode * nxt=nullptr; ListNode * lft=pHead; ListNode * cur =pHead->next; ListNode * lleft=head; int rep=0; while(cur!=nullptr){ if(lft->val!=cur->val){ lft=lft->next; cur=cur->next; lleft=lleft->next; continue; } while(cur!=nullptr&&cur->val==lft->val){ //del nxt=cur->next; free(cur); lft->next=nxt; cur=nxt; } free(lft); lleft->next=cur; if(cur==nullptr){ break; } lft=cur; cur=cur->next; } ListNode * ret=head->next; free(head); return ret; } };
//1.注意到,要删干净必须要记录left之前的一个节点。因此需要创建头结点
//2.注意处理边缘关系
2.1 只管lft和cur,nxt只在需要删减时计算,减少维护成本
2.2 lleft用于划定左边界
2.3 找到重复序列后,进入删除循环
2.4 删除循环结束后,删除left
2.5 开始重新初始化各个变量
2.5.1 lleft不变、如果没有节点,直接break->表现为cur=nullptr
2.5.2 如果有一个节点,lft=它,cur=nullptr,同样直接break
2.5.3 多个节点,又变成了更小规模的问题。lleft->lft->cur->xxx
先写清楚算法再开始