// 面试题18(二):删除链表中重复的结点
// 题目:在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重复
// 结点被删除之后,链表如图3.4(b)所示。
思路:该题需要注意的地方太多了,一个点一个点写出来,也记不住。看源码中的特例,然后直接背代码吧。
void DeleteDuplication(ListNode **pHead)
{
if (pHead == nullptr || *pHead == nullptr)
return;
ListNode *pNode = *pHead;
ListNode *pPreNode = nullptr;
while (pNode != nullptr)
{
bool needDelete = false;
ListNode * pNext = pNode->m_pNext;
if (pNext!= nullptr && pNext->m_nValue == pNode->m_nValue)
needDelete = true;
if (!needDelete)
{
pPreNode = pNode;
pNode = pNode->m_pNext;// pNode = pNext;在特殊情况不可取。
}
else
{
int nValue = pNode->m_nValue;
ListNode * pToBeDelet = pNode;
while (nValue = pToBeDelet->m_nValue && pToBeDelet != nullptr)
{
pNext = pToBeDelet->m_pNext;
delete pToBeDelet;
pToBeDelet = nullptr;
pToBeDelet = pNext;
}
if (pPreNode == nullptr)
{
*pHead = pNext;
}
else {
pPreNode->m_pNext = pNext;
}
pNode = pNext;
}
}
}