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

编程之美:从无头单链表中删除节点,讨论

时间:2014-09-18 18:56:24      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:编程之美   单链表   指针   内存   删除节点   

1.问题描述

假设有一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个),请将该节点从单链表中删除。

如下图所示:

bubuko.com,布布扣

 这种情况大家都知道,将下一个节点的data和next拷贝到当前节点,并将当前节点的next设置为下下个节点,然后释放下一个节点所占内存(free),

如果红字条件去掉:

还用上面的方法就有问题,一般上面方法的代码如下:

void DeleteRandomNode(Node* pCurrent)
{
     if(pCurrent == NULL)
            return;
     Node* pNext = pCurrent->next;     
     if(pNext == NULL)
     {
          //表明当前节点是最后一个节点
          pCurrent = NULL;//这里如果为最后一个节点就将当前指针设置为NULL,这些写法有问题!
     }
     pCurrent->data = pNext->data;
     pCurrent->next = pNext->next;
     
     delete pNext; 
}

    红色注释说明了问题:将pCurrent设置为NULL并没有改变当前节点的上一个节点的next值,因为上一个节点的next存的是pCurrent指向的Node的地址。

    简单来说就是pCurrent仅仅存了一个内存地址,而将pCurrent设置为NULL这一行为,并没有改变上一节点的next值。如果当前节点是最后一个节点,那么上一个节点的next值就应该为NULL,但是显然上述方法无法达到这一要求。所以红字条件去掉之后就无法通过上述方法解决问题了。

   

编程之美:从无头单链表中删除节点,讨论

标签:编程之美   单链表   指针   内存   删除节点   

原文地址:http://blog.csdn.net/kk791159796/article/details/39375703

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