【发布时间】:2017-12-26 01:51:58
【问题描述】:
以下代码用于从排序列表中删除重复项。它在我的电脑上运行正常。我的问题是关于使用
head = head->下一个;
之后
删除头部;
在下面。是否违法?这些代码在我的编译器上生成正确的结果。它会依赖于编译器吗?还是符合 C++11 标准?
struct ListNode {
int val;
ListNode *next;
explicit ListNode(int x) : val(x), next(nullptr) { }
};
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if (head && (head->next = deleteDuplicates(head->next)) && head->next->val == head->val){
delete head;
head = head->next;
}
return head;
}
};
int main() {
ListNode *h = new ListNode(0);
auto cur=h;
cur->next= new ListNode(1);
cur=cur->next;
cur->next= new ListNode(2);
cur=cur->next;
cur->next= new ListNode(2);
cur=cur->next;
Solution sol;
auto xx=sol.deleteDuplicates(h);
return 0;
}
【问题讨论】:
-
您正在输入未定义的行为。
-
完全未定义。内存中那个位置的数据一删除就是垃圾。
-
但是我的编译器没有警告...
-
警告您注意所有可能的 UB 不是您的编译器的责任。如果可以这样做,我们几乎不会经常出现运行时错误。
-
@drombe -- 更改编译器选项,例如优化,您可能会看到不同的故事。底线是行为未定义。