力扣 876. 链表的中间节点
这道题刚开始我是直接暴力遍历链表一遍得到长度,然后再通过长度的一半来再次遍历确定要返回的结点。
看题解发现有更简单更直观的方法,快慢指针法
1 struct ListNode* middleNode(struct ListNode* head) 2 {//快慢指针法 3 struct ListNode *fast=head;//快指针 4 struct ListNode *slow=head;//慢指针 5 while(fast&&fast->next)//保证快指针移动的合法性,而且循环结束的条件就是快指针移动到链表尾巴时退出循环 6 { 7 fast=fast->next->next;//快指针一次移动两个结点长度 8 slow=slow->next;//慢指针一次移动一个结点长度 9 } 10 return slow;//当快指针移动到最后时,慢指针正好移动至链表的中间 11 }
这样看快慢指针法更容易理解而且会比暴力遍历更加美观好看