题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
函数的声明如下:
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);
思路:删除链表中某个结点,要知道这个结点前面的结点,但是现在要求O(1)时间删除,只知道后面结点的信息,如果把后面结点复制到要删除的结点,删除后面的那个结点就间接实现了 删除指定结点,但是有一种特殊情况,当要删除的结点是最后一个结点时候,则要老老实实从前往后找到最后一个结点的前一个结点
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted)
{
if(pListHead==NULL || pToBeDeleted==NULL)
return;
if(pListHead==pToBeDeleted && pToBeDeleted->m_pnext==NULL)//只有一个结点,且删除的是头结点
{
delete pToBeDeleted;
pToBeDeleted = NULL;
pListHead = NULL;
}
else if(pToBeDeleted->m_pnext!=NULL)//不是尾结点
{
ListNode* pnext = pToBeDeleted->m_pnext;
pToBeDeleted->m_value = pnext->m_value;
pToBeDeleted->m_pnext = pnext->m_pnext;
delete pnext;
pnext = NULL;
}
else
{
ListNode* pnode = pListHead;
while (pnode->m_pnext!=pToBeDeleted)
{
pnode = pnode->m_pnext;
}
pnode->m_pnext = NULL;
delete pToBeDeleted;
pToBeDeleted = NULL;
}
}