剑指offer的一个题,题目是要求在最少的时间内删除链表的节点。
问题分析:对于链表的删除,按照剑指offer的一贯思路就是展开讨论:1、空链表咋办、待删除的节点是空节点咋办;2、要删除的节点在链表中的位置有三种情况:1、链表只有一个节点,待删除节点是表头又是尾节点;2、链表有多个节点,待删除的节点是尾节点;3、要删除的节点不是尾节点。
我们的思路是:读入待删除节点的下一个节点的信息,用待删除节点的下一个节点信息复制到待删除节点,然后删除待删除节点的下一个节点。
复杂度分析:对于n-1个非尾节点,可以在O(1)时间内搞定,对于尾节点,需要顺序查找,时间复杂度为O(n),所以总的平均复杂度为[(n-1)xO(1)+O(n)]/n=O(1)。
struct ListNode{
int m_value;
ListNode* m_next;
};
void DeletNode(ListNode** pListHead, ListNode* pToBeDeletd)
void DeletNode(ListNode** pListHead, ListNode* pToBeDeletd){
if(!pListHead || !pToBeDeletd){
return;
}
//要删除的节点不是尾节点
if(pToBeDeletd -> m_next!= nullptr){
ListNode* pNext = pToBeDeletd -> m_next; //保存要删除的节点的下一个节点
pToBeDeletd -> m_value = pNext -> m_value; //将要删除节点的下一个节点的值和指针覆盖掉要删除的节点
pToBeDeletd -> m_next = pNext -> m_next;
}
delete pNext;
pNext = nullptr;//删除要删除节点的下一个节点,并将其指针指向nullptr
//链表只有一个节点,删除头节点也是尾节点
else if(*pListHead == pToBeDeletd){
delete pToBeDeletd;
pToBeDeletd = nullptr;
*pListHead = nullptr;
}
//链表中有多个节点,删除尾节点
else{
ListNode* pNode = *pListHead;
while(pNode-> m_next != pToBeDeletd){
pNode = pNode->m_next;
}
pNode->m_next = nullptr;
delete pToBeDeletd;
pToBeDeletd = nullptr;
}
}