在O(1)的时间删除链表结点

  1 /*
  2     在O(1)的时间删除链表结点
  3     给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下
  4     struct ListNode
  5     {
  6         int         m_nValue;
  7         ListNode*   m_pNext;
  8     };
  9
 10     void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);
 11 */
 12
 13 /*
 14     在单向链表中删除一个结点,最常规的做法无疑是从链表的头结点开始,顺序遍历查找要删除的结点,并在链表中删除该结点。
 15     自然。这样的时间复杂度为O(n),达不到题目的要求。需要遍历去查找到将要删除的结点的前面一个结点。在单向链表中,结点中没
    有指向前一个结点的指针,所以只能从头结点开始顺序查找。
 16     那是不是一定需要得到被删除的结点的前一个结点呢?答案是否定的。我们可以很方便得到要删除结点的下一个结点。如果我们把下
    一个结点的内容复制到需要删除的结点上覆盖原有的内容,再把下一个结点删除,那是不是就相当于把当前需要删除的结点删除了。
 17     但是如果要删除的结点位于链表的尾部,那么它就没有下一个结点,怎么办?我们任然从链表的头结点开始,顺序遍历得到该结点的
    前序结点,并完成删除操作。
 18     最后需要注意的是,如果链表中只有一个结点,而我们又要删除链表的头结点(也是尾结点),此时我们在删除结点之后,还需要把
    链表的头结点设置为NULL.
 19     对应的代码如下:
 20 */

 21

 22 void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted)
 23 {
 24     if(!pListHead || !pToBeDeleted)
 25         return;
 26
 27     //要删除的结点不是尾结点
 28     if(pToBeDeleted->m_pNext != NULL)
 29     {
 30         ListNode* pNext = pToBeDeleted->m_pNext;
 31         pToBeDeleted->m_nValue = pNext->m_nValue;
 32         pToBeDeleted->m_pNext = pNext->m_pNext;
 33         delete pNext;
 34         pNext = NULL;
 35     }
 36
 37     //只有一个结点
 38     else if(pListHead == pToBeDeleted)
 39     {
 40         delete pToBeDeleted;
 41         pToBeDeleted = NULL;
 42         *pListHead = NULL;
 43     }
 44
 45     //链表中有多个结点,删除尾结点。要删除的结点为尾结点。
 46     else
 47     {
 48         ListNode* pNode = *pListHead;
 49         while(pNode->m_pNext != pToBeDeleted)
 50             pNode = pNode->m_pNext;
 51
 52         pNode->m_pNext = NULL;
 53         delete pToBeDeleted;
 54         pToBeDeleted = NULL;
 55     }
 56 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值