链表的中间结点
思路1:
- 第一次循环:求链表总长度,计算中间结点的位置
- 第二次循环:根据中间节点的位置走到中间节点
思路2:快慢指针
先定义快慢指针
fast,slow
,都位于头节点慢指针每次往后走1步,快指针每次往后走2步。
奇数个结点时:当
fast->next == NULL
就没有必要往后走了,此时slow
也刚好指向中间节点偶数个结点时:当
fast
走到NULL
的时候,此时slow
也刚好指向中间节点
为什么快慢指针可以找到中间节点?
慢指针每次走一步,快指针每次走两步,当快指针走到链表的尾结点时,假设链表的长度为
n
快指针走的路程是慢指针的两倍,即
2*慢=快
此时慢指针走的路程就是
n/2
思路代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {
ListNode* slow = head, *fast = head;
//慢指针每次走1步,快指针每次走2步
while(fast && fast->next){//不能写while(fast->next && fast)
slow = slow->next;
fast = fast->next->next;
}
//此时slow指向的结点刚好就是中间结点
return slow;
}