100-60

O(1)时间删除链表节点
本文探讨了一种在O(1)时间内删除链表中指定节点的方法,适用于面试和技术实现。通过巧妙地利用节点后继的数据覆盖当前节点,并删除后继节点,实现了高效删除。

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; 
      } 
}

转载于:https://my.oschina.net/dapengking/blog/94731

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值