链表节点结构如下,
struct ListNode
{int m_nKey;
ListNode* m_pNext;
};
求出在O(1)时间内删除链表给定结点的算法函数,该函数的声明如下:
void DeleteNode(ListNode *pListHead, ListNode *pToBeDeleted);
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
//在O(1)时间内删除链表结点
void DeleteNode(ListNode *pListHead, ListNode *pToBeDeleted)
{
if (NULL != pToBeDeleted->m_pNext) //如果删除的节点不是尾节点
{
ListNode *pRealDeleted = pToBeDeleted->m_pNext;
pToBeDeleted->m_nKey = pRealDeleted->m_nKey;
//将待删除的节点的下一个节点的内容复制到要删除的节点
pToBeDeleted->m_pNext = pRealDeleted->m_pNext;
//将要删除的节点的指针指向下一个节点的下一个节点
delete pRealDeleted;
//删除要删除的节点的下一个节点,该节点的内容被保存待要删除的节点
}
else //如果删除的节点是尾节点
{
ListNode *pNode = pListHead;
while (NULL != pNode) //非空链表
{
if (pNode->m_pNext == pToBeDeleted) //找到了尾节点的前一个节点
{
pNode->m_pNext = NULL;
delete pToBeDeleted;
break;
}
pNode = pNode->m_pNext; //正向遍历链表
}
}
}