码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-08-17 15:30:37      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1),时间删除该节点。链表节点与函数的定义如下:

    struct ListNode{

    int  m_nValue; ListNode*  m_pNext;

 }

   void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);

   解析:既然已经给定了要删除节点的指针,可以将删除节点的下一个节点的内容复制到要删除的节点,覆盖原有的内容,并将要删除节点的指针指向下一个节点的下一个节点,再将下一个节点删除。这期间要考虑两种特殊的情况:1、要删除的节点是最后一个节点,需要遍历链表找到删除节点的前序节点,并完成删除操作;2、如果当前链表中只有一个节点,要将链表的头结点置NULL。

 1 struct ListNode{
 2     int m_nValue;
 3     ListNode* m_pNext;
 4 };
 5 
 6 void DeleteNode(ListNode** pListNode,ListNode* pToBeDeleted){
 7     if(!pListNode||!pToBeDeleted)
 8         return ;
 9     //正常情况
10     if(pToBeDeleted->m_pNext!=NULL){
11          pToBeDeleted->m_nValue = pToBeDeleted->m_pNext->m_nValue;
12          pToBeDeleted->m_pNext = pToBeDeleted->m_pNext->m_pNext;
13          delete pToBeDeleted->m_pNext;
14          pToBeDeleted->m_pNext = NULL;
15     }
16     //链表中只有一个节点
17     else if(*pListNode == pToBeDeleted){
18         delete pToBeDeleted;
19         pToBeDeleted = NULL;
20         *pListNode = NULL;
21     }
22     //链表中有多个节点,删除尾节点
23     else{
24         ListNode *pNode = *pListNode;
25         while(pNode->m_pNext!=pToBeDeleted){
26             pNode = pNode->m_pNext;
27         }
28         pNode->m_pNext = NULL;
29         delete pToBeDeleted;
30         pToBeDeleted = NULL;
31     }
32 }

 

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

标签:

原文地址:http://www.cnblogs.com/yangrenzhi/p/5780138.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!