问题是从排序列表中删除重复项,代码是:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (head == NULL) return NULL;
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;
}
}
return head;
}
};
代码是对的,我的谜题是:
指针“cur”,在“delete”之后,在“for”中使用“cur”和“cur = cur->next”。为什么没问题?
不好意思打扰了,leetcode给代码AC了,所以我怀疑自己,感谢解答。
最佳答案
首先澄清一下:指针是指向内存区域的东西。
如果您在指针上调用 delete
,您将释放该指针指向的任何内容,但您不会破坏指针本身。您可以重用该指针,但在它被删除后再次取消引用它是未定义的行为,因为没有任何东西可以保证它曾经指向的内存仍然对您可用。
您的代码导致 UB自从之后
delete cur;
您使用 cur = cur->next
取消引用该指针。您无法保证 cur
仍指向有效的内存区域,其中 next
具有作为地址的实际含义。
您的代码的正确版本如下:
ListNode* deleteDuplicates(ListNode* head) {
if (head == NULL) return NULL;
for (ListNode* prev = head, *cur = head->next; prev->next; cur = prev->next)
{
if (prev->val == cur->val)
{
prev->next = cur->next;
delete cur;
}
else
{
prev = cur;
}
}
return head;
}
关于c++ - 删除后指针还能用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32023047/