83.删除排序链表中的重复元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {  
public:
ListNode* deleteDuplicates(ListNode* head) {
if (head == nullptr || head->next == nullptr){
return head;
}

ListNode* slow = head;
ListNode* fast = head->next;

while (fast) {
// 由于 fast 进入循环,需要时刻检测 fast 不为空
while (fast != nullptr && slow->val == fast->val) {
fast = fast->next;
slow->next = fast;
}
// 前面如果 fast 为空会退出循环,因此移动前需要检查是否是因为 fast为空退出
if (fast != nullptr) {
slow = fast;
fast = fast->next;
}
}

return head;
}
};

这道题主要强调 while 循环,由于 fast 检测是否为空在最外层 while 中检测,但它只能保证当前这次循环不为空,所以 fast 如果进入下一个 while 循环(代码中内存 while 循环),记得要继续检测是否为空,不然出现未定义错误。之所以强调,是这种错误容易犯。