我们要删除结点i,先把i的下一个结点j的内容复制到i,然后把i的指针指向结点j的下一个结点,此时再删除结点j,其效果等价于把结点i删除了。
特殊情况:要删除的结点位于链表的尾部,链表只有一个结点
void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted)
{
if(!pListHead || !pToBeDeleted)
return;
if(pToBeDeleted->m_pNext!=NULL)//如果要删除结点后面还有结点
{
ListNode* pNext=pToBeDeleted->m_pNext;
pToBeDeleted->m_nValue=pNext->m_nValue;
pToBeDeleted->m_pNext=pNext->m_pNext;
delete pNext;
pNext=NULL;
}
else if(*pListHead==pToBeDeleted)//如果链表只有一个结点
{
delete pToBeDeleted;
pToBeDeleted=NULL;
*pListHead=NULL;
}
else//如果链表有多个结点,且删除最后一个结点,那么只能遍历链表
{
ListNode *pNode=*pListHead;
while(pNode->m_pNext!=pToBeDeleted)
pNode=pNode->m_pNext;
pNode->m_pNext=NULL;
delete pToBeDeleted;
pToBeDeleted=NULL;
}
}