给定单链表头节点和一个结点指针,在O(1)时间删除该结点。
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
void DeleteNode( ListNode** pListHead, ListNode* pToBeDeleted )
{
//1.链表为空
if ( NULL == *pListHead || NULL == pToBeDeleted )
return;
//2.链表只有一个结点 //O(1)
if ( *pListHead == pToBeDeleted )
{
delete pToBeDeleted;
pToBeDeleted = NULL;
*pListHead = NULL;
return;
}
//3.被删除结点为链表尾节点 //O(N)
if ( NULL == pToBeDeleted->m_pNext )
{
ListNode* pPrev = *pListHead;
while ( pToBeDeleted != pPrev->m_pNext )
pPrev = pPrev->m_pNext;
delete pToBeDeleted;
pToBeDeleted = NULL;
pPrev->m_pNext = NULL;
return;
}
//4.被删除结点是至少有两个结点的链表非尾节点//O(1)
ListNode* pNext = pToBeDeleted->m_pNext;
pToBeDeleted->m_nValue = pNext->m_nValue;
pToBeDeleted->m_pNext = pNext->m_pNext;
delete pNext;
pNext = NULL;
return;
}