用快慢指针求ListNode的中点,网上的答案大都是下面这个:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* middleNode(ListNode* head) {
ListNode* slow = head;
ListNode* fast = head;
while (fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
};
但是实际运行时会报bug,原因在于循环的判断条件,如果fast==NULL,那么利用NULL指针访问next(第二个条件)必然会报错,基于此,做如下修改:
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* middleNode(ListNode* head) {
if(head==NULL){
return head;
}
if(head->next==NULL){
return head;
}
ListNode *slow=head;
ListNode *fast=head;
while(fast!=NULL){
if(fast->next==NULL){
break;
}
slow=slow->next;
fast=fast->next->next;
}
return slow;
}
};
在利用快慢指针判断链表中有没有环的题目中,也需要这样的判断,因为如果把两个判断条件写在一起,在第一个不满足的情况下,第二个会出现访问的问题。
最近又重新考虑了这个问题,发现原始代码应该是没错的,因为 && 连接的两个判断条件,当第一个条件不满足时不会再考虑第二个条件,因此也就不存在上述的问题。。。。。。