错误题目:876. 链表的中间结点
错误原因:试图使用空指针
解决方法:找出等价判断条件进行替换,排除对空指针的引用。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* middleNode(struct ListNode* head){
struct ListNode* fast=head;
struct ListNode* slow=head;
while(fast->next!=NULL &&fast->next->next!=NULL )
{
fast=fast->next->next;
slow=slow->next;
}
if(fast->next->next==NULL)
{
slow=slow->next;
}
return slow;
}
第一眼看上去好像没毛病,注意空指针的坑,下面看错误提示:
说试图会使用空指?
if里面的判断,fast->next可能就是空指针,当fast->next为空时,fast->next->next即空指针的next,是错误的,由while循环条件可知,到if判断时,要么, fast->next为空,要么fast->next->next为空,因此我们把判断条件改为 if(fast->next!=NULL)即 等价于原报错判断。
这样就成功啦,第一次写博客,有许多细节没注意到,勿怪。