通过这道题可以引出一个十分重要的算法解题思路——快慢指针。顾名思义,快慢指针就是有两个指针,一个指针走的快,一个指针走的慢。定义两个指针slow和fast。slow指针每走一次,fast指针走两次,这样就可以得出规律2slow=fast。这种思想通常应用在寻找中间节点的算法题中。我们现在应用快慢指针来实现一下这道题。
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head)
{
ListNode*slow=head;
ListNode*fast=head;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
}
return slow;
}
那么对于这道题,还有一个问题,能否将while循环的结束条件改为(fast->next&&fast)呢?
答案是不能!
当有奇数个节点时,循环的结束条件是fast->next指针为空指针;当有偶数个节点时,循环的结束条件是fast。当链表中有偶数个节点时,fast指针最后一次会走到空,空指针不能进行解引用操作。所以当进入while循环中,先判断fast->next是否为空时会进行报错。所以不能更改。
大家有兴趣可以自行尝试一下