题目
给你单链表的头结点
head,
请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
题解
设置快慢指针slow和fast,slow每次走一步,fast每次走两步,当fast走完时,slow刚好指到链表中间结点。从下图中可以看出,当链表结点个数为奇数时,fast指向链表尾结点,slow刚好指向中间节点;当链表结点个数为偶数时,fast指向NULL,slow刚好指向第二个中间结点。所以循环的条件为 while(fast && fast->next),最后返回slow即可。
代码如下:
struct ListNode* middleNode(struct ListNode* head) { struct ListNode* slow = head; struct ListNode* fast = head; while (fast && fast->next) { slow = slow->next; fast = fast->next->next; } return slow; }