题目:在O(1)时间内删除链表结点
在链表中删除一个结点有两种方法:
- 从链表头结点开始遍历整个链表,直到要删除的结点的前一个结点为止,此时使要删除结点的前一结点的next指针指向要删除结点的下一个结点,再删除要删除的结点
- 当要删除结点的不为尾结点时,直接将要删除结点的下一结点的值复制给要删除结点并同时将要删除结点的next指针指向下一结点的下一个结点
如下图所示:
具体代码如下:
void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted) {
if (!pListHead || !pToBeDeleted)
return;
//删除节点不为尾节点
if (pToBeDeleted->m_pNext != NULL) {
ListNode* pNext = pToBeDeleted->m_pNext;
pToBeDeleted->m_nKey = pNext->m_nKey;
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;
}
}