leetcode icon indicating copy to clipboard operation
leetcode copied to clipboard

LeetCode题解c++版本的P44页有问题

Open aCayF opened this issue 10 years ago • 3 comments

P44页讲到了Remove Duplicates from Sorted List的迭代解法,其中的一段代码片段:

for (ListNode *prev = head, *cur = head->next; cur; cur = cur->next) {
    if (prev->val == cur->val) {
        prev->next = cur->next;
        delete cur;
    } else {
        prev = cur;
    }
}

既然delete cur语句已经将cur删除,为什么还可以在for的条件语句里执行cur = cur->next?

PS.感谢作者辛勤的劳动为我们带来了如此有价值的作品,再次感谢:)

aCayF avatar Aug 12 '14 12:08 aCayF

Delete cur 后,cur 所指向的对象释放了,但cur只是个名字,这个名字还是可以复用的

On Tuesday, August 12, 2014, Lice Pan [email protected] wrote:

P44页讲到了Remove Duplicates from Sorted List的迭代解法,其中的一段代码片段:

for (ListNode *prev = head, *cur = head->next; cur; cur = cur->next) { if (prev->val == cur->val) { prev->next = cur->next; delete cur; } else { prev = cur; }}

既然delete cur语句已经将cur删除,为什么还可以在for的条件语句里执行cur = cur->next?

PS.感谢作者辛勤的劳动为我们带来了如此有价值的作品,再次感谢:)

— Reply to this email directly or view it on GitHub https://github.com/soulmachine/leetcode/issues/27.

My tech blog: http://www.soulmachine.me My GitHub: https://github.com/soulmachine My LinkedIn: http://www.linkedin.com/in/soulmachine/ My Sina Weibo: http://weibo.com/soulmachine

soulmachine avatar Aug 15 '14 00:08 soulmachine

delete cur之后cur->next还能引用?本人c++菜鸟,望指教:)

aCayF avatar Aug 15 '14 08:08 aCayF

这个问题我有看法,delete cur之后,cur当然那还能被附新值,但是继续使用cur->next 赋值且程序通过的原因是cur原来指向的内存没有被其他程序污染,所以可以找到cur->next,其实这样写是不太妥当的,我改成了下面这个写法,功能一样,就是防止面试官质疑:

class Solution { public: ListNode *deleteDuplicates(ListNode *head) { if(head == NULL) return NULL;

    for(ListNode *prev = head, *curr = head->next;
        curr;
        curr = curr->next){
            if(prev->val == curr->val){
                ListNode *next = curr->next;
                prev->next = next;
                delete curr;
                curr = prev; 
            }
            else{
                prev = curr;
            }
        }
    return head;
}

};

riveridea avatar Jan 14 '15 08:01 riveridea