在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
分析
1、确定去重的范围,采用 前开后闭 的方法。
2、增加一个头结点,统一操作。
(prev, last]的三种情况
1、last->next = = nullptr,整张没有重复区间
2、last->next = =nullptr (prev, last],确定有重复区间,prev->next = last->next(nullptr)
3、last->next != nullptre (prev, last],确定有重复区间,prev->next = last->next;
有重复区间时,prev和last不相邻。
/*
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 = new ListNode(0);
head->next = pHead;
ListNode* prev = head;
ListNode* last = pHead;
while(last != nullptr)
{
// 确定重复区间的开始位置
while(last->next != nullptr && last->val != last->next->val)
{
prev = last;
last = last->next;
}
// 确定重复区域:如果last和last->next相等,就一直让last往后走,指向最后一个重复的数字
while(last->next != nullptr && last->val == last->next->val)
{
last = last->next;
}
// (prev, last]三种情况
// last->next == nullptr,整张没有重复区间
// last->next == nullptr (prev, last],确定有重复区间,prev->next = last->next(nullptr)
// last->next != nullptre (prev, last],确定有重复区间,prev->next = last->next;
// 如果没有重复区间,prev和last紧挨
if(prev->next != last)
{
prev->next = last->next;
}
last = last->next;
}
return head->next;
}
};