采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师,在课程5-1中,while循环每次都声明了一个next指针。请问这些指针是否需要回收呢?
或者更一般地,指针一般何时需要回收?
谢谢老师!
一个简单的原则就是有new才应该有delete,也就是有内存空间的申请才应该在这部分内存空间使用完毕后进行回收。
在这个问题中,传来的head指针指向了一个链表,链表中每个节点的内存空间已经申请好了。算法的任务是让你反转整个链表,返回翻转后整个链表的新的头指针返回。我们在这个算法里不能对这个链表节点的内存进行回收,如果回收了,我们返回的链表就是空了。
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)处不要每次都初始化一个指针,虽然所占内存空间不大。但是链表如果很大很长的话,这些积累是不是还有些影响?
这里每次没有new一个新的空间,只是在进行指针指向的赋值。
我理解你的意思了。这里关键是每次while都声明了一个新的ListNode*类型的变量。其实这样写和每次在while中声明一个int是一样的。没有任何问题。首先,从程序的角度,没有问题,不会造成内存泄露。因为没有new。每个重新声明的ListNode*在每轮循环后就失效(块作用域)。其次,效率上,在现代计算机上近乎一致(有可能有差别,但绝不致命)。尤其是现代编译器的优化,其实很可能会将转成的机器码优化成你写的样子。最后,语意表达上,虽然这个代码比较短,你将next的声明放在循环外看起来也很顺畅。但是对于更复杂的逻辑,从语意表达的角度,应该遵循哪里使用变量,就在哪里声明的原则。一口气把要用的变量都提前声明好,是相对比较古老的语言的要求,比如C语言:)
赞!感谢波波老师的细心解答
非常感谢老师,明白了。
登录后可查看更多问答,登录/注册
课程配套大量BAT面试真题,高频算法题解析,强化训练
1.1k 13
1.1k 12
653 11
1.5k 10
1.2k 10