请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

代码中的next指针是否需要回收?

老师,在课程5-1中,while循环每次都声明了一个next指针。请问这些指针是否需要回收呢?

或者更一般地,指针一般何时需要回收?

谢谢老师!

正在回答

3回答

liuyubobobo 2017-11-13 04:38:36

一个简单的原则就是有new才应该有delete,也就是有内存空间的申请才应该在这部分内存空间使用完毕后进行回收。


在这个问题中,传来的head指针指向了一个链表,链表中每个节点的内存空间已经申请好了。算法的任务是让你反转整个链表,返回翻转后整个链表的新的头指针返回。我们在这个算法里不能对这个链表节点的内存进行回收,如果回收了,我们返回的链表就是空了。

2 回复 有任何疑惑可以回复我~
PeterSix3244453 2018-03-15 21:58:08
ListNode* reverseList(ListNode *head) {
    ListNode *prev = NULL;
    ListNode *cur = head;
    ListNode *next = NULL;
    while (cur != NULL) {
        next = cur->next;// (1)这步视频里面是ListNode* next = cur->next;
        cur->next = prev;
        prev = cur;
        cur = next;
    }
    return prev;
}

波波老师好:
我觉得“慕慕9414451”同学,是不是想说(1)处不要每次都初始化一个指针,虽然所占内存空间不大。
但是链表如果很大很长的话,这些积累是不是还有些影响?



0 回复 有任何疑惑可以回复我~
  • 这里每次没有new一个新的空间,只是在进行指针指向的赋值。
    回复 有任何疑惑可以回复我~ 2018-03-16 05:39:07
  • 我理解你的意思了。这里关键是每次while都声明了一个新的ListNode*类型的变量。其实这样写和每次在while中声明一个int是一样的。没有任何问题。首先,从程序的角度,没有问题,不会造成内存泄露。因为没有new。每个重新声明的ListNode*在每轮循环后就失效(块作用域)。其次,效率上,在现代计算机上近乎一致(有可能有差别,但绝不致命)。尤其是现代编译器的优化,其实很可能会将转成的机器码优化成你写的样子。最后,语意表达上,虽然这个代码比较短,你将next的声明放在循环外看起来也很顺畅。但是对于更复杂的逻辑,从语意表达的角度,应该遵循哪里使用变量,就在哪里声明的原则。一口气把要用的变量都提前声明好,是相对比较古老的语言的要求,比如C语言:)
    回复 有任何疑惑可以回复我~ 2018-03-16 05:57:07
  • 赞!感谢波波老师的细心解答
    回复 有任何疑惑可以回复我~ 2018-03-16 09:03:27
提问者 慕慕9414451 2017-11-13 06:51:44

非常感谢老师,明白了。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信