剑指offer上的题目:在一个排序链表中有重复节点,删除。
直接上代码,里面有解释很清楚。
struct ListNode{
int m_value;
ListNode* m_next;
};
void DeleteDuplication(ListNode** pHead){
if(pHead==nullptr && *pHead == nullptr)
return;
//定义当前节点和前一节点,当前节点指向表头,前一节点为空
ListNode *preNode = nullptr;
ListNode *pNode = *pHead;
while(pNode!=nullptr){
//定义当前节点的下一个节点,用于判别是否和当前节点重复
ListNode *pNext = pNode -> m_next;
bool needDelete = false;// 定义一个标志,判别是否需要删除
if(pNext!=nullptr&&pNext->m_value==pNode->m_value){
needDelete = true;
}
if(!needDelete){
/*不需要删除时,则当前节点转移到前一节点,
下一个节点转移到当前节点*/
preNode = pNode;
pNOde = pNode -> m_next;
}
else{
//需要删除,开始处理,找到删除的截止节点
int value = pNOde->m_value;
ListNode *pToBedel = pNode;
while(pToBedel!=nullptr&&pToBedel->m_value==value){
pNext = pToBedel->m_next;//将待删除节点的下一个节点保存
delete pToBedel;
pToBedel = nullptr;//删除当前节点
pToBedel = pNext;//节点传递
}
if(pToBedel==nullptr){
*pHead = pNext;//这个地方要结合具体例子理解,删完了,头结点指向nullptr
//break;
}
else
preNode->m_next = pNext;//不然重复节点前一节点指向重复节点后一节点
pNode = pNext;//遍历到重复节点下一个节点为当前节点,继续开始判别是否重复.....
}
}
}