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

来源:互联网 发布:字幕时间轴调整软件 编辑:程序博客网 时间:2024/06/04 18:13
  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 }


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一岁把尿不尿怎么办 五个月的宝宝大便干燥怎么办 婴儿便秘怎么办什么方法最有效 8个月小孩便秘怎么办 1个月新生儿便秘怎么办 新生儿头竖立0分怎么办 20天的宝宝便秘怎么办 出生23天的宝宝便秘怎么办 喝奶粉的宝宝便秘怎么办 抱孩子抱的驼背怎么办 4岁宝宝不拉屎怎么办 小朋友大便拉不出来怎么办 儿童便秘拉不出来怎么办 没感冒喉咙有痰怎么办 宝宝喂不进去药怎么办 新生儿只放屁不拉大便怎么办 新生儿腹胀不拉大便怎么办 8月宝宝咳嗽有痰怎么办 2个月婴儿惊吓怎么办 吃了米粉不拉屎怎么办 奇异果奶昔苦了怎么办 8个月宝宝偏瘦怎么办 一岁宝宝螺旋腿怎么办 七个月宝宝晚上咳嗽厉害怎么办 孕7个月感冒咳嗽怎么办 4个月婴儿肺炎怎么办 宝宝吃胡萝卜泥拉肚子怎么办 宝宝吃土豆泥不消化怎么办 五个月宝宝奶睡怎么办 橘子和牛奶一起吃了怎么办 半岁宝宝不喝水怎么办 一岁宝宝总是便秘怎么办 1岁的宝宝不喝水怎么办 两月宝宝不喝水怎么办 破壁机打出的果汁很浓稠怎么办 榨的果汁不甜怎么办 11个月宝宝吃盐怎么办 1岁半宝宝长牙慢怎么办 小孩里面的牙黑怎么办 7个半月宝宝便秘怎么办 2个月婴幼儿便秘怎么办