题目
给定单向链表的头指针和一个结点指针,定义一个函数在o(1)时间删除该结点。
思路
如果要删除的结点不是尾结点,我们要删除结点i,先把i的下一个结点j的内容复制到i,然后把i的指针指向结点j的下一个结点。此时再删除结点j,其效果刚好是把结点i给删除了。
如果要删除的结点位于链表的尾部,我们从链表的头结点开始,顺序遍历得到该结点的前序结点,并完成删除操作。
如果链表中只有一个结点,而我们又要删除链表的头结点 ,此时我们删除结点后,还需要把链表的头结点设置为NULL。
代码
struct ListNode
{
int m_nValue;
ListNode *m_pNext;
};
void DeleteNode(ListNode **pListHead, ListNode* pToBeDeleted)
{
if (!pListHead || !pToBeDeleted)
return;
// 要删除的结点不是尾结点
if (pToBeDeleted->m_pNext != nullptr)
{
ListNode* pNext = pToBeDeleted->m_pNext;
pToBeDeleted->m_nValue = pNext->m_nValue;
pToBeDeleted->m_pNext = pNext->m_pNext;
delete pNext;
pNext = nullptr;
}
// 链表中只有一个结点,删除头结点(也是尾结点)
else if (*pListHead == pToBeDeleted)
{
delete pToBeDeleted;
pToBeDeleted = nullptr;
*pListHead = nullptr;
}
// 链表中有多个结点,删除尾结点
else
{
ListNode* pNode = *pListHead;
while (pNode->m_pNext != pToBeDeleted)
{
pNode= pNode->m_pNext;
}
pNode->m_pNext = nullptr;
delete pToBeDeleted;
pToBeDeleted = nullptr;
}
}