题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
题目地址
思路
- 注意重复的节点不保留,所以要特别注意头结点也重复的情况——最好的做法是新设一个头结点
- delete 指针指向的内存后,必须将指针重新指向 nullptr
Code
class Solution {
public:
ListNode * deleteDuplication(ListNode* pHead)
{
if (pHead == NULL) return pHead;
ListNode* head = new ListNode{-1}; // 设置一个头结点
head->next = pHead;
ListNode* pre = head;
ListNode* cur = pHead;
while (cur != NULL && cur->next != NULL) {
if (cur->val != cur->next->val) { // 不重复时向后遍历
pre = cur;
cur = cur->next;
}
else { // 发现重复
int val = cur->val;
while (cur != NULL && cur->val == val) { // 循环删除重复
auto tmp = cur;
cur = cur->next;
delete tmp; // delete + nullptr
tmp = nullptr;
}
pre->next = cur;
}
}
auto ret = head->next;
delete head; // delete + nullptr
head = nullptr;
return ret;
}
};