100-60

60.在O(1)时间内删除链表结点(链表、算法)。
题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:
struct ListNode
{
      int        m_nKey;
      ListNode*  m_pNext;
};
函数的声明如下:
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);
分析:这是一道广为流传的Google面试题,能有效考察我们的编程基本功,还能考察我们的反应速度,
更重要的是,还能考察我们对时间复杂度的理解。

思路:我们可以将找到的节点后面的那个节点删除,然后,将它里面的m_nKey赋值给指针所指向的节点。这样做的时间复杂度为O(1)。

贴上代码:

void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted) 
{ 
      if(!pListHead || !pToBeDeleted) 
            return; 
      // if pToBeDeleted is not the last node in the list 
      if(pToBeDeleted->m_pNext != NULL) 
      { 
            // copy data from the node next to pToBeDeleted 
            ListNode* pNext = pToBeDeleted->m_pNext; 
            pToBeDeleted->m_nKey = pNext->m_nKey; 
            pToBeDeleted->m_pNext = pNext->m_pNext; 
            // delete the node next to the pToBeDeleted 
            delete pNext; 
            pNext = NULL; 
      } 
      // if pToBeDeleted is the last node in the list 
      else 

      { 
             // get the node prior to pToBeDeleted 
             ListNode* pNode = pListHead; 

             while(pNode->m_pNext != pToBeDeleted) 
             { 

                   pNode = pNode->m_pNext; 
             } 

             // deleted pToBeDeleted 
             pNode->m_pNext = NULL; 
             delete pToBeDeleted; 
             pToBeDeleted = NULL; 
      } 
}

你可能感兴趣的:(100-60)