一.题目:
给定单向链表的头指针和一个结点指针,给定一个函数在O(1)时间删除该结点。链表结点与函数定义如下:
二.分析:
共需考虑三种情况:
1.首先考虑的是并不是一定需要得到被删除结点的前一个结点,如果我们把下一个结点的内容复制到需要删除的结点上覆盖原有的内容,再把下一个结点删除即可。
2.如果需要删除的结点位于链表的尾部,那我们还是需要顺序遍历链表。
3.如果链表只有一个结点,此时除了删除还需要将头结点设置为NULL。
三.答案:
void deleteNode(ListNode** pListNode, ListNode* pToBeDeleted) {
if (!pListNode || !pToBeDeleted) {
return;
}
if (pToBeDeleted->next != NULL) {
ListNode* pNext = pToBeDeleted->m_pNext;
pToBeDeleted->m_nValue = pNext->m_nValue;
pToBeDeleted->m_pNext = pNext->m_pNext;
delete pNext;
} else if (*pListNode == pToBeDeleted) {
delete pListNode;
pToBeDeleted = NULL;
*pListNode = NULL;
} else {
ListNode* pNext = *pListNode;
while (pNext->m_pNext != pToBeDeleted) {
pNext = pNext->m_pNext;
}
pNext->m_pNext = NULL;
delete pToBeDeleted;
pToBeDeleted = NULL;
}
}
四.相关题目:
无