18.2 删除链表中的重复节点
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,
返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路分析
好久没有玩C++的指针,竟然忘了 delete。。。
所以,本题就是要提醒一下自己,c++指针资源的释放,不要忘记delete。然后在给它指向 NULL。
链表的题目相对比较简单,但是在处理 head 节点, tail 节点时,要考虑周全。不然看似简单的题目,往往会提交好几次都不通过。
补充一点:
《剑指OFFER》 的第18题,删除指定节点的代码。要求O(1)时间复杂度。这道题也值得看一看。 当我们已经确定待删除节点的位置时,想要删除它,通常的想法是知道该节点的父节点。但实际上,知道它的 next 节点也一样可以删除。
代码
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if (pHead == NULL || pHead->next == NULL) return pHead;
ListNode* pPre = NULL;
ListNode* pCur = pHead;
while (pCur != NULL) {
ListNode* pNext = pCur->next;
bool isNeedDelete = false;
if (pNext != NULL && pCur->val == pNext->val) {
isNeedDelete = true;
}
if (!isNeedDelete) {
pPre = pCur;
pCur = pCur->next;
}
else {
ListNode* pTmp = pCur;
int value = pCur->val;
while (pTmp != NULL && pTmp->val == value) {
pNext = pTmp->next;
delete pTmp;
pTmp = NULL;
pTmp = pNext;
}
if (pPre == NULL) {
pHead = pNext;
}
else {
pPre->next = pNext;
}
pCur = pNext;
}
}
return pHead;
}
};