题目:给定单向链表得头指针和一个节点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下:
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
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(*pListNode == pToBeDeleted)
{
delete pToBeDeleted;
pToBeDeleted = NULL;
*pListNode = NULL;
}
//删除尾节点
else
{
ListNode* pNode = *pListHead;
while(pNode->m_pNext != pToBeDeleted)//找到最后一个节点
{
pNode = pNode->m_pNext; //pNode 指向尾节点之前
}
pNode->m_pNext = NULL;
delete pToBeDeleted = NULL;
pToBeDeleted = NULL;
}
}